13

asp.net Web API で System.Web.Http.Filters.ActionFilterAttribute を継承するフィルターを作成し、HttpActionExecutedContext 結果オブジェクト内のデータの一部にアクセスしたいと考えています。

このオブジェクトはいつ、どの段階で入力されますか? OnActionExecuted メソッドとその常に null をオーバーライドするときに見たように?

何か案は?

編集:

たとえば、ここに私のカスタムフィルターがあります:

public override OnActionExecuted(HttpActionExecutedContext context)
{
    //context.Result.Content is always null

    base.OnActionExecuted(context);
}
4

4 に答える 4

7

コンテンツの結果で ReadAsStringAsync を使用することになりました。実際のリクエストが完了する前に、プロパティにアクセスしようとしていました。

于 2012-05-15T19:59:30.437 に答える
2

受賞した回答は ReadAsStringAsync を参照していましたが、回答には例がありませんでした。私はgdpからのアドバイスに従い、やや実用的な例を導き出しました...

MessageInterceptor という単一のクラスを作成しました。私は ActionFilterAttribute から派生するだけで、コントローラーがそれを取得する前、およびコントローラーが終了した後、すぐに webAPI メソッド呼び出しをインターセプトし始めました。これが私の最終クラスです。この例では、XML シリアライザーを使用して、要求と応答の両方を XML 文字列に取得します。この例では、リクエストとレスポンスが移入されたオブジェクトとして検出されます。これは、デシリアライズがすでに行われていることを意味します。データが入力されたモデルからデータを収集し、XML 文字列にシリアル化することは、IIS によって返された実際の投稿要求と応答ではなく、要求と応答の表現です。

コード例 - MessageInterceptor

using System.IO;
using System.Linq;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
using System.Xml.Serialization;

namespace webapi_test
{
    public class MessageInterceptor : ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            base.OnActionExecuting(actionContext);
            var headers = actionContext.Request.Content.Headers.ToString();
            var request = actionContext.ActionArguments.FirstOrDefault().Value;
            var xml = SerializeXMLSerializer(request, "");
        }

        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            base.OnActionExecuted(actionExecutedContext);
            var headers = actionExecutedContext.Response.Content.Headers.ToString();
            var response = actionExecutedContext.Response.Content.ReadAsStringAsync().Result;
            var xml = SerializeXMLSerializer(response, "");
        }

        public static string SerializeXMLSerializer(object o, string nameSpace)
        {
            string serializedValue;
            var writer = new StringWriter();
            XmlSerializer serializer = new XmlSerializer(o.GetType(), nameSpace);
            serializer.Serialize(writer, o);
            serializedValue = writer.ToString();
            return serializedValue;
        }
    }
}
于 2013-07-27T21:59:15.213 に答える
0

以下を使用して、応答文字列を読み取ります。

    public static string GetResponseContent(HttpResponseMessage Response)
    {
        string rawResponse = string.Empty;
        try
        {
            using (var stream = new StreamReader(Response.Content.ReadAsStreamAsync().Result))
            {
                stream.BaseStream.Position = 0;
                rawResponse = stream.ReadToEnd();
            }
        }
        catch (Exception ex) { throw; }
        return rawResponse;
    }
于 2017-07-18T12:43:37.420 に答える