私は、Visual Studio 2012 ターゲット .Net 4+ を使用して (自己ホスト型) WebApi アプリケーションに取り組んでおり、MVC 5 と WebApi 2.0 を利用するために、できるだけ早く VS2013 に移行することを目指しています。
すべての送信 Uri の前に、受信要求のクエリ パラメーターとして送信される文字列を付ける必要があります。課題は、コントローラー、モデル、またはビュー/ビューモデルに特定のコードを使用せずにこれを行うことです。また、可能な限り、送信応答のすべてのプロパティを処理するためにリフレクション/再帰を使用する必要があるアクション フィルターの使用も避けたいと思いますが、結果アクション フィルターを使用して、シリアライザーで使用できる URL プレフィックス。
これまでのところDelegatingHandler
、リクエストのクエリ パラメータから使用する URL プレフィックスを取得して、リクエスト/コントローラ コンテキスト オブジェクトにプロパティとして追加できるようにしました。aを使用して、応答JsonConverter
のすべてのタイプ プロパティに目的のプレフィックスを追加します。Uri
残っているのは、リクエストのパラメーターで指定された Url プレフィックスをコンバーターに取得することです。に渡されるシリアライザーにJsonConvertor
はContext
プロパティがありますが、それが要求コンテキストに関連しているかどうか、またどのように関連しているかはわかりません。
これを解決する方法はいくつか考えられますが、パイプラインで 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);
}