覆蓋 MVC POST 請求的內容標頭
我對 MVC 相當陌生,所以我希望有一個解決我的問題的方法。我正在使用第三方硬體與我的 MVC Web API 進行通信。硬體以 JSON 格式發送請求,我可以很好地提取這些請求。但是,由於衝突,我正在將這些請求的參數更改為綁定模型對象。
例如
Public Function POSTRequest(Action As String, Stamp As String) As HttpResponseMessage ... End Function Public Function POSTRequest(Action As String, OpStamp As String) As HttpResponseMessage ... End Function所以這兩種方法共享同一張名片,所以它們不能存在於同一個控制器中。
因此,我創建了模型綁定對象來容納這些參數。問題是,一旦我這樣做,Web API 就會抱怨請求說“Content-Type”沒有定義。看著它,第三方硬體不會隨請求發送內容類型。在網上查看,我發現這導致瀏覽器將其視為內容類型“application/octet-stream”。然後,這不能將其轉換為定義為參數的綁定對象。
我們無法控制第三方硬體,因此我們無法為這些請求定義內容類型。所以,我的問題是,有沒有辦法攔截這些請求並向它們添加內容類型?或者甚至是另一種解決方法?
我認為您可以使用
ActionFilterAttribute. 請參閱文件:創建自定義操作過濾器。在您的情況下,您可以使用以下範例(在 C# 中,因為我的 VB 技能已經過時)。它使用application/json值覆蓋任何請求
Content-Type標頭 。請注意,您可能必須增強它以支持每種類型(例如,我認為這不應該用於 MultiPart 請求)。HttpContentpublic class UpdateRequestAttribute: ActionFilterAttribute { public override void OnActionExecuting(HttpActionContext actionContext) { actionContext.Request.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"); base.OnActionExecuting(actionContext); } }然後將此屬性添加到控制器類中,例如:
[UpdateRequest] public class HomeController : ApiController { //[...] }在這種情況下,所有對 Home 控制器的請求都將
Content-Type被覆蓋。或者,您也可以編寫一個自定義的HTTP 消息處理程序,它在管道的早期被呼叫,並且不限於特定的控制器。檢查下圖以了解伺服器如何處理請求。
例如,如果目前為空,此消息處理程序會將請求設置
Content-Type為application/json 。public class CustomMessageHandler : DelegatingHandler { protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { if (request.Content.Headers.ContentType == null) { request.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"); } return base.SendAsync(request, cancellationToken); } }最後,這裡是如何更新
WebApiConfig以便將您的消息處理程序添加到管道:public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.MessageHandlers.Add(new CustomMessageHandler()); // Other configuration not shown... } }
