Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为使用Axis1.4Web服务的C#Web服务客户端添加自定义Http头_C#_Web Services_Wsdl_Axis - Fatal编程技术网

如何为使用Axis1.4Web服务的C#Web服务客户端添加自定义Http头

如何为使用Axis1.4Web服务的C#Web服务客户端添加自定义Http头,c#,web-services,wsdl,axis,C#,Web Services,Wsdl,Axis,我正试图用c语言编写一个web服务客户端,它的web服务是JavaAxis1.4。 Axis服务需要HTTP标头中的授权:Basic Base64EncodedToken标头值。 我找不到一种在visual studio.net中使用web服务的标准方式(如普通WSDL生成的引用或WSE3.0)中设置此标头的方法 我不能使用WCF,因为该项目是使用.NET2.0开发的 有什么方法可以做到这一点吗?如果要发送自定义HTTP头(不是SOAP头),则需要使用HttpWebRequest类,代码如下所示

我正试图用c语言编写一个web服务客户端,它的web服务是JavaAxis1.4。 Axis服务需要HTTP标头中的授权:Basic Base64EncodedToken标头值。 我找不到一种在visual studio.net中使用web服务的标准方式(如普通WSDL生成的引用或WSE3.0)中设置此标头的方法

我不能使用WCF,因为该项目是使用.NET2.0开发的


有什么方法可以做到这一点吗?

如果要发送自定义HTTP头(不是SOAP头),则需要使用HttpWebRequest类,代码如下所示:

HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
webRequest.Headers.Add("Authorization", token);

您无法使用visual studio生成的代理添加HTTP头,这可能是一个真正的难题。

我们在这里讨论的是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上的基本身份验证通过.NET运行对IBMESB的SOAP调用


我希望这能帮助一些人,因为我在网上寻找解决方案时遇到了巨大的问题。

看来原始作者已经找到了他们的解决方案,但是对于任何到这里来想添加实际自定义标题的人来说,如果你有权修改生成的协议代码,你可以覆盖
GetWebRequest

protected override System.Net.WebRequest GetWebRequest(Uri uri)
{
  System.Net.WebRequest request = base.GetWebRequest(uri);
  request.Headers.Add("myheader", "myheader_value");
  return request;
}

如果要单步执行,请确保通过属性删除调试程序步骤。

我找到了此代码,正在解决我的问题


以下是对我有效的方法:

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服务未接受请求,并且我遇到了未经授权的错误。

您可以通过添加自定义消息检查器来插入自定义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头。

user334291的回答对我来说是个救命稻草。只想添加如何添加OP最初打算做的事情(我最终使用了什么):

在生成的webservice代码上重写GetWebRequest函数:

protected override System.Net.WebRequest GetWebRequest(Uri uri)
{
    System.Net.WebRequest request = base.GetWebRequest(uri);          
    string auth = "Basic " + Convert.ToBase64String(System.Text.Encoding.Default.GetBytes(this.Credentials.GetCredential(uri, "Basic").UserName + ":" + this.Credentials.GetCredential(uri, "Basic").Password));
    request.Headers.Add("Authorization", auth);
    return request;
}
以及在调用Web服务之前设置凭据:

  client.Credentials = new NetworkCredential(user, password);       


“您不能使用visual studio生成的代理添加HTTP头”仍然是这样吗?我可以像这样添加头,但如何将它们返回到WCF服务中?这正是我所需要的。Web服务返回500而不是401表示未经授权,因此凭据从未使用接受答案中的方法发送。虽然我觉得修改生成的代码有点脏,但这允许我在第一个请求中强制发送它们。看,嘿,这正是我需要的。但是我应该把这个函数放在哪里呢?但是一个添加头的值部分不能有多个逗号分隔的值吗?要知道这一点也很重要,例如对于OAuth授权参数,我已经将其与“reference.cs”文件一起放在一个分部类中,这样,如果它被重新生成,它就不会丢失。我尝试了这个方法,效果非常好。只需创建一个与代理同名、与webservice客户端代理同名的分部类。在那个类中添加这个方法。这实际上是我的问题。不知怎的,当您在代理中设置凭据时,它不起作用。谢谢我使用的是WCF/Soap,所以这对我来说非常有效。在我的例子中,我需要一个名为“Auth-Token”的自定义头。所以我的(VB.NET)代码是-->httpRequestProperty.Headers.Add(“身份验证令牌”,“xxxxx”),这也解决了我的问题。我和塔瓦尼有同样的问题,当我通过代理设置凭据时,我得到了401。但是在你的代码中,一切都很完美!非常感谢!杰出的我的工作是设置授权头以包含承载令牌。嗯。。。在调试器中效果很好,但部署到Azure后,“OperationContext.Current的值不是此OperationContextScope安装的OperationContext值。”嘿,这似乎正是我需要的。但是我应该把这个函数放在哪里呢?我也不知道放在哪里,我正在使用.NET4.0。我的服务生成方式与我发现的其他示例不同,我摆脱了上面的重载,只有这段代码发挥了全部作用:serviceClient.CookieContainer=new CookieContainer();Saeb Amini,谢谢你。这就是我所寻找的解决问题的答案,它使用了一个第三方web服务,该服务已转变为双因素身份验证。他们的API由XSDs和WSDLs提供给我们,我们通过svcutil程序生成客户机代码。使用上面的代码,我可以添加将令牌注入HTTP头的行为,以进行双因素身份验证。再次感谢@很高兴知道这对你有帮助!:)我已经在上面的解决方案中添加了我的标题,它工作得很好。我面临在Soap请求中添加安全头的问题。谢谢我将.Net Framwork代码移植到.Net Core,并且我的
CustomBehavior
类出现问题。我所要做的就是删除一些在.NETCore中显然不需要的类继承。感谢您仅添加所需的代码!
  client.Credentials = new NetworkCredential(user, password);