ASP.Net MVC 5中如何将HTTP Header传递至服务引用?
简单解决ASP.NET MVC5中WebService代理传递请求头的问题
嗨,刚接触.NET遇到这种请求头传递的问题太正常了,我完全懂你不想碰复杂的IClientInterceptor的心情,给你几个简单直接的方案,都是不用绕弯子就能搞定的:
方案一:手动给WebService代理添加请求头
当你通过VS添加服务引用后,会自动生成对应的客户端代理类(比如叫YourServiceClient)。你可以在调用WebService方法前,手动把控制器拿到的UserId塞进请求头里:
// 从MVC控制器的请求中获取UserId string userId = Request.Headers["UserId"]; // 实例化你的WebService客户端 using (var serviceClient = new YourServiceClient()) { // 创建HttpRequestMessageProperty来添加自定义头 var httpRequestProp = new HttpRequestMessageProperty(); httpRequestProp.Headers.Add("UserId", userId); // 将这个属性附加到当前操作上下文的出站消息中 OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProp; // 现在调用WebService方法,请求头就会带过去了 serviceClient.YourTargetWebServiceMethod(); }
注意:如果是异步调用,要确保OperationContext.Current在同一个线程上下文里,最好在using块内部处理所有操作,避免上下文丢失。
方案二:封装成扩展方法,复用性更强
如果多个地方都需要传递这个头,可以给代理类写个扩展方法,这样每次调用都不用重复写设置头的代码:
public static class ServiceClientExtensions { public static void SetUserIdHeader(this YourServiceClient client, string userId) { var httpRequestProp = new HttpRequestMessageProperty(); httpRequestProp.Headers.Add("UserId", userId); OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProp; } }
然后在控制器里用起来就很简洁:
string userId = Request.Headers["UserId"]; using (var serviceClient = new YourServiceClient()) { serviceClient.SetUserIdHeader(userId); serviceClient.YourTargetWebServiceMethod(); }
额外检查点
别忘了先确认你的MVC控制器确实能拿到AJAX传的UserId头:
- 前端AJAX要正确设置headers:
$.ajax({ url: "/YourController/YourAction", type: "POST", headers: { "UserId": "your-user-id-value" }, // 其他参数... }); - 控制器里可以先打印
Request.Headers["UserId"]确认值是否正确,再往下传递。
内容的提问来源于stack exchange,提问作者Anshu
相关产品推荐
相关产品推荐

