我正在努力在我的解决方案中设置基础架构,以发送和检索REST WCF服务的自定义标头。基本上,我们需要将UserID,密码,令牌值从客户端发送到服务,如果提供的值有效,则操作将继续执行,否则抛出异常。
我们已经有很少的类继承自IDispatchMessageInspector,IClientMessageInspector,IEndPointBehaviour,MessageHeader等接口,这对于带有soap请求的WCF来说很好。我尝试将这些类用于我的新REST WCF服务,但由于MessageHeader派生类仅支持Soap,因此无法使用。
我也尝试过使用WebOperationContext,但没有运气:(
请提供解决方案以及示例项目以解决此问题。
非常感谢!
在您的情况下似乎更容易询问ASP NET管道
如果您将以下内容添加到您的WCF服务,以允许它连接到ASPNET管道
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
然后你可以简单地使用HttpContext对象,就像从普通的aspnet应用程序那样获取头文件,例如
System.Web.HttpContext.Current.Request.Headers["CustomHeader"]
如果你想在wcf rest服务中添加http头,你应该使用HttpRequestMessageProperty,它有一个Headers属性,你可以通过它的Headers属性设置http Header
using (OperationContextScope scope = new OperationContextScope(client.InnerChannel))
{
HttpRequestMessageProperty property;
// if OutgoingMessageProperties already has HttpRequestMessageProperty, use the existing one , or initialize a new one and
set OutgoingMessageProperties's HttpRequestMessageProperty.Name key's value to the initialized HttpRequestMessageProperty so that the HttpRequestMessageProperty will work
if (OperationContext.Current.OutgoingMessageProperties.ContainsKey(HttpRequestMessageProperty.Name)){
property = OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] as HttpRequestMessageProperty;
}
else
{
property = new HttpRequestMessageProperty();
OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = property;
}
// add headers to HttpRequestMessageProperty, it will become the http header of the reuqest
property.Headers.Add(System.Net.HttpRequestHeader.Authorization, "myAuthorization");
string re = client.HelloWorld();
}
关于获取Header,只需使用WebOperationContext.Current.Headers。
WebOperationContext.Current.IncomingRequest.Headers["MyCustomHttpHeader"]
请参考http://kenneththorman.blogspot.com/2011/02/wcf-rest-client-using-custom-http.html