如何为使用Axis 1.4 Web服务的C#Web服务客户端添加自定义Http标头
我试图编写一个Web服务客户端在C#中的Web服务是Java的Axis 1.4。 Axis服务需要HTTP Headers中的Authorization:Basic Base64EncodedToken标头值。 我无法find一种方法来设置这个标头在Visual Studio中使用Web服务的标准方式,就像正常的WSDL生成的引用或WSE3.0
我无法使用WCF,因为项目是使用.net 2.0开发的。
有没有办法做到这一点?
看起来原来的作者已经find了他们的解决scheme,但是对于任何想要添加实际自定义标题的人来说,如果你有权访问生成的协议代码,你可以重写GetWebRequest
:
protected override System.Net.WebRequest GetWebRequest(Uri uri) { System.Net.WebRequest request = base.GetWebRequest(uri); request.Headers.Add("myheader", "myheader_value"); return request; }
请确保您删除DebuggerStepThroughAttribute
属性,如果你想步入它。
我们在这里谈论WCF吗? 我有服务调用没有添加http授权标题的问题,包装任何调用到这个声明解决了我的问题。
using (OperationContextScope scope = new OperationContextScope(RefundClient.InnerChannel)) { var httpRequestProperty = new HttpRequestMessageProperty(); httpRequestProperty.Headers[System.Net.HttpRequestHeader.Authorization] = "Basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes(RefundClient.ClientCredentials.UserName.UserName + ":" + RefundClient.ClientCredentials.UserName.Password)); OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProperty; PaymentResponse = RefundClient.Payment(PaymentRequest); }
这是通过基于HTTP或https的身份validation,通过.NET运行对IBM ESB的SOAP调用。
我希望这可以帮助别人,因为我有大量的问题在网上寻找解决scheme。
如果你想发送一个自定义的HTTP Header(而不是SOAP Header),那么你需要使用HttpWebRequest类的代码如下所示:
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url); webRequest.Headers.Add("Authorization", token);
你不能使用visual studio生成的代理添加HTTP头,这真的很痛苦。
我发现这个代码,并解决了我的问题。
http://arcware.net/setting-http-header-authorization-for-web-services/
protected override WebRequest GetWebRequest(Uri uri) { // Assuming authValue is set from somewhere, such as the config file HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(uri); request.Headers.Add("Authorization", string.Format("Basic {0}", authValue)); return request; }
您可以通过添加自定义消息检查器来注入自定义的HTTP头,而不是修改自动生成的代码或将每个调用包装为重复代码,这比听起来容易:
public class CustomMessageInspector : IClientMessageInspector { readonly string _authToken; public CustomMessageInspector(string authToken) { _authToken = authToken; } public object BeforeSendRequest(ref Message request, IClientChannel channel) { var reqMsgProperty = new HttpRequestMessageProperty(); reqMsgProperty.Headers.Add("Auth-Token", _authToken); request.Properties[HttpRequestMessageProperty.Name] = reqMsgProperty; return null; } public void AfterReceiveReply(ref Message reply, object correlationState) { } } public class CustomAuthenticationBehaviour : IEndpointBehavior { readonly string _authToken; public CustomAuthenticationBehaviour (string authToken) { _authToken = authToken; } public void Validate(ServiceEndpoint endpoint) { } public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) { } public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) { } public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) { clientRuntime.ClientMessageInspectors.Add(new CustomMessageInspector(_authToken)); } }
而当实例化你的客户端类时,你可以简单地把它作为一个行为来添加:
this.Endpoint.EndpointBehaviors.Add(new CustomAuthenticationBehaviour("Auth Token"));
这将使每个传出的服务调用具有您的自定义HTTP标头。
请参阅构build安全的ASP.NET应用程序:身份validation,授权和安全通信,并search“使用特定的凭据”。 另请参阅CredentialCache类的MSDN文档。
这是什么对我有用:
protected override System.Net.WebRequest GetWebRequest(Uri uri) { HttpWebRequest request; request = (HttpWebRequest)base.GetWebRequest(uri); NetworkCredential networkCredentials = Credentials.GetCredential(uri, "Basic"); if (networkCredentials != null) { byte[] credentialBuffer = new UTF8Encoding().GetBytes( networkCredentials.UserName + ":" + networkCredentials.Password); request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(credentialBuffer); request.Headers["Cookie"] = "BCSI-CS-2rtyueru7546356=1"; request.Headers["Cookie2"] = "$Version=1"; } else { throw new ApplicationException("No network credentials"); } return request; }
不要忘记设置这个属性:
service.Credentials = new NetworkCredential("username", "password");
Cookie和Cookie2在标题中设置,因为Java服务不接受请求,我得到未经授权的错误。