2017-03-12 14 views
3

asp.net webapiのメッセージハンドラにプロパティ値を追加します。 シナリオ私は、authenticationTokenが異なる要求の一部であるが、クライアントが要求ヘッダーのトークンを受け入れるように頼むwebapiを実装しています。いくつかのアプリケーションはすでにこのAPIを使用しているが、要求本体にトークンを送信しています。 私は実装を変更したくありません。私はリクエストヘッダーを読み込み、ヘッダーが含まれている場合はその値をリクエストのプロパティに割り当てます。 それは可能ですか?メッセージハンドラでプロパティ値を追加

答えて

5

はい、メッセージハンドラでリクエストuri & formdataを変更することは可能です。ここにそれを行う例があります、あなたはこれを試すことができます。私はこれを処理するためにclass APIKeyHandlerを追加し、私のWebApiConfigにハンドラを追加しました。 APIKeyHandler

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     System.Web.Routing.RouteTable.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{action}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

     //add the handler class in WebApiConfig 
     config.MessageHandlers.Add(new APIKeyHandler()); 
    } 
} 

コード:ExampleAPIController

public class APIKeyHandler : DelegatingHandler 
{ 
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     var formData = await request.Content.ReadAsFormDataAsync(); 
     if (request.Method.Method.Equals("POST")) 
     { 
      request.Content = new FormUrlEncodedContent(ModifyYourFormData(formData, request)); 
     } 
     request.RequestUri = new Uri(ModifyYourURI(request.RequestUri.ToString(), request), UriKind.Absolute); 

     return await base.SendAsync(request, cancellationToken); 
    } 

    public IEnumerable<KeyValuePair<string, string>> ModifyYourFormData(NameValueCollection source, HttpRequestMessage request) 
    { 
     //Add your logic here 

     string Authorized = ""; 
     try 
     { 
      Authorized = request.Headers.GetValues("AuthorizedKey").FirstOrDefault(); 
     } 
     catch (Exception ex) 
     { 

     } 

     List<KeyValuePair<string, string>> formData; 
     formData = source.AllKeys.SelectMany(
      source.GetValues, 
      (k, v) => new KeyValuePair<string, string>(k, v)).ToList(); 

     if (!string.IsNullOrEmpty(Authorized)) 
     { 
      formData.Insert(0, new KeyValuePair<string, string>("AuthorizedKey", Authorized)); 
     } 

     return formData; 
    } 

    public string ModifyYourURI(string uri, HttpRequestMessage request) 
    { 
     //Add your logic here 

     string Authorized = ""; 
     try 
     { 
      Authorized = request.Headers.GetValues("AuthorizedKey").FirstOrDefault(); 
     } 
     catch (Exception ex) 
     { 

     } 

     if (!string.IsNullOrEmpty(Authorized)) 
     { 
      return uri + "?AuthorizedKey="+ Authorized; 
     } 
     else 
     { 
      return uri; 
     } 
    } 
} 

コード:私はあなたがWebApiConfigExample WebAPI with Modify Request Body in MessageHandler

コードから、それを確認することができます私Gitリポジトリにソリューションをアップロードした

public class ExampleAPIController : ApiController 
{ 
    public async Task<string> Post() 
    { 
     string returnValue = "OK"; 

     var formKeyValueData = await Request.Content.ReadAsFormDataAsync(); 

     string AuthorizedKey = formKeyValueData["AuthorizedKey"]; 

     return returnValue; 
    } 

    public string Get(string AuthorizedKey) 
    { 
     string returnValue = "OK"; 
     return returnValue; 
    } 
} 

POSTリクエストの呼び出し例:

enter image description here

GETリクエストの呼び出し例:

enter image description here

+0

は、私はできもう一つの解決策ハンドラメソッドでリクエストオブジェクトのプロパティのリクエストタイプと名前を取得しますか? –

+0

はい、私はそれに取り組んでいます、あなたをすぐに戻すでしょう。 – csharpbd

+0

私の更新の回答をGitリポジトリで確認してください。 – csharpbd

0

私はリクエストに動的プロパティを追加するために把握

if (request.Headers.Contains(HeaderName) && request.Method.Method.Equals("POST")) 
      { 
       var formData = await request.Content.ReadAsStringAsync(); 
       dynamic data = JsonConvert.DeserializeObject(formData); 
       data.authenticationToken = request.Headers.GetValues(HeaderName).FirstOrDefault(); 
       request.Content = new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json"); 
      } 
関連する問題