2

私は、Visual Studio 2012 ターゲット .Net 4+ を使用して (自己ホスト型) WebApi アプリケーションに取り組んでおり、MVC 5 と WebApi 2.0 を利用するために、できるだけ早く VS2013 に移行することを目指しています。

すべての送信 Uri の前に、受信要求のクエリ パラメーターとして送信される文字列を付ける必要があります。課題は、コントローラー、モデル、またはビュー/ビューモデルに特定のコードを使用せずにこれを行うことです。また、可能な限り、送信応答のすべてのプロパティを処理するためにリフレクション/再帰を使用する必要があるアクション フィルターの使用も避けたいと思いますが、結果アクション フィルターを使用して、シリアライザーで使用できる URL プレフィックス。

これまでのところDelegatingHandler、リクエストのクエリ パラメータから使用する URL プレフィックスを取得して、リクエスト/コントローラ コンテキスト オブジェクトにプロパティとして追加できるようにしました。aを使用して、応答JsonConverterのすべてのタイプ プロパティに目的のプレフィックスを追加します。Uri

残っているのは、リクエストのパラメーターで指定された Url プレフィックスをコンバーターに取得することです。に渡されるシリアライザーにJsonConvertorContextプロパティがありますが、それが要求コンテキストに関連しているかどうか、またどのように関連しているかはわかりません。

これを解決する方法はいくつか考えられますが、パイプラインで MVC/WebApi がリクエスト (コンテキスト) 情報をどのように運ぶかについて、「知識不足」の壁にぶつかり続けます。

委任ハンドラー:

class UrlPrefixHandler : DelegatingHandler 
{
    private string GetUrlPrefixValue(HttpRequestMessage request)
    {
        var queryStrings = request.GetQueryNameValuePairs();
        if (queryStrings == null)
            return null;

        var match = queryStrings.FirstOrDefault(kv => string.Compare(kv.Key, "url_prefix", true) == 0);
        if (string.IsNullOrEmpty(match.Value))
            return null;

        return match.Value;
    }

    async protected override Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, CancellationToken cancellationToken)
    {
        string urlPrefix = GetUrlPrefixValue(request);

        // TODO : How do I get this to the serializer on a per request basis?
        //        and do this without placing requirements on controllers/models/views?

        HttpResponseMessage response = await base.SendAsync(request, cancellationToken);

        return response;
    }
}

Json コンバーター:

class UriPrefixConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return typeof(Uri).IsAssignableFrom(objectType);
    }

    public override bool CanRead
    {
        get { return false; }
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException("Unnecessary because CanRead is false. The type will skip the converter.");
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        JObject result = new JObject();

        //serializer.

        Uri u = (Uri)value as Uri;

        // TODO : Getting the prefix from the request's context somehow
        Uri prefixed = new Uri("/uriPrefix" + u.OriginalString, UriKind.Relative);

        writer.WriteValue(prefixed.OriginalString);
    }
4

0 に答える 0