asp.net webapiのメッセージハンドラにプロパティ値を追加します。 シナリオ私は、authenticationTokenが異なる要求の一部であるが、クライアントが要求ヘッダーのトークンを受け入れるように頼むwebapiを実装しています。いくつかのアプリケーションはすでにこのAPIを使用しているが、要求本体にトークンを送信しています。 私は実装を変更したくありません。私はリクエストヘッダーを読み込み、ヘッダーが含まれている場合はその値をリクエストのプロパティに割り当てます。 それは可能ですか?メッセージハンドラでプロパティ値を追加
3
A
答えて
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;
}
}
}
コード:私はあなたがWebApiConfig
のExample 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リクエストの呼び出し例:
GETリクエストの呼び出し例:
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");
}
関連する問題
- 1. TForm:メッセージハンドラを追加し、継承して呼び出す
- 2. SOAPメッセージハンドラ
- 3. タプルC#7に追加プロパティを追加
- 4. powershellでのプロパティの追加
- 5. ネストされたプロパティに値を追加できません
- 6. メッセージハンドラの寿命
- 7. メッセージハンドラの問題
- 8. の追加プロパティが
- 9. JButtonプロパティを追加する
- 10. 兄弟にプロパティを追加
- 11. GeoJSONにプロパティを追加
- 12. Neo4j:プロパティの数値に追加できますか?
- 13. Javascriptを:objectに配列の値を追加する方法プロパティ
- 14. プロパティと値を持つオブジェクトを配列に追加するPHP
- 15. pythonのint値にプロパティを追加する
- 16. エンティティのプロパティに値を追加するAzureテーブルのストレージ
- 17. 値を追加した後に空のMSIプロパティ
- 18. Jena:プロパティに数値を追加する方法は?
- 19. Doctrineサブクエリの値をエンティティの仮想プロパティに追加する
- 20. リストから特定のClassプロパティに値を追加
- 21. 実行時にSpring Beanにプロパティ値を追加する
- 22. Javascriptプロパティに複数の値を追加する
- 23. 新しいプロパティを動的に追加:mongooseのモデルに値findOne
- 24. リストのプロパティ値を追加する方法
- 25. Hubspot一括追加プロパティ
- 26. UML:モデルの追加プロパティが
- 27. Azure VMの追加プロパティ
- 28. 追加プロパティ付きナップザックアルゴリズム
- 29. Vuejs v-ifステートメント追加プロパティ
- 30. 添付プロパティの追加パラメータ
は、私はできもう一つの解決策ハンドラメソッドでリクエストオブジェクトのプロパティのリクエストタイプと名前を取得しますか? –
はい、私はそれに取り組んでいます、あなたをすぐに戻すでしょう。 – csharpbd
私の更新の回答をGitリポジトリで確認してください。 – csharpbd