gpt4 book ai didi

.net - 覆盖 MVC POST 请求的内容 header

转载 作者:可可西里 更新时间:2023-11-01 15:10:34 28 4
gpt4 key购买 nike

我是 MVC 的新手,所以我希望有一个解决我的问题的方法。我正在使用第三方硬件与我的 MVC Web API 进行通信。硬件以 JSON 格式发送请求,我可以很好地提取它。但是,由于冲突,我正在将这些请求的参数更改为绑定(bind)模型对象。

例如

        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

所以这两个方法共享同一个调用卡,所以它们不能存在于同一个 Controller 中。

因此,我创建了模型绑定(bind)对象来存放这些参数。问题是,一旦我这样做,Web API 就会提示请求未定义“Content-Type”。看着它,第三方硬件不会随请求发送内容类型。在网上查看,我发现这导致浏览器将其视为内容类型“application/octet-stream”。这无法将 this 转换为定义为参数的绑定(bind)对象。

我们无法控制第三方硬件,因此我们无法为这些请求定义内容类型。所以,我的问题是,有没有办法拦截这些请求并向它们添加内容类型?还是另一种解决方法?

最佳答案

我认为您可以使用 ActionFilterAttribute。请参阅文档:Creating Custom Action Filters .

对于您的情况,您可以使用以下示例(在 C# 中,因为我的 VB 技能已经过时)。它用 application/json 值覆盖任何请求 Content-Type header 。请注意,您可能必须增强它以支持各种 HttpContent(例如,我认为这不应该用于 MultiPart 请求)。

public 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);
}
}

然后将此属性添加到 Controller 类中,例如:

[UpdateRequest]
public class HomeController : ApiController
{
//[...]
}

在这种情况下,对 Home Controller 的所有请求都将覆盖其 Content-Type


或者,您也可以编写自定义 HTTP Message Handlers它在管道的早期被调用,并且不限于特定的 Controller 。查看下图以了解服务器如何处理请求。

ASP.net Server Side handlers

例如,此消息处理程序会将请求 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...

}
}

关于.net - 覆盖 MVC POST 请求的内容 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41097424/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com