【问题标题】:Adding Authorization Header to Web Reference将授权标头添加到 Web 参考
【发布时间】:2013-01-23 20:42:03
【问题描述】:

我正在尝试向客户端的 Web 服务发出请求(我不知道客户端的底层平台)。我使用“添加 Web 引用”在 Visual Studio 2010 中使用了客户端的 WSDL,并生成了我的代理类(称为“ContactService”)。

我现在需要在我的服务请求中添加如下所示的授权标头。

Header=Authorization & Value=Basic 12345678901234567890

(上面的“123456...”值只是占位符)

ContactService service = new ContactService();

//not sure if this is the right way - it's not working
WebClient client = new WebClient();
client.Headers.Add("Authorization", "Basic 12345678901234567890");            
service.Credentials = client.Credentials;

int contactKey = null;
try
{                
   contactKey = service.CreateContact("ABC", emailAddress, firstName, lastName, null);
}

将授权标头添加到服务请求的正确方法是什么?

谢谢!

【问题讨论】:

    标签: c# .net web-services web-reference request-headers


    【解决方案1】:

    上面的响应是正确的,但它必须在不同的位置。

    我将此添加到 .Net 生成的 Web 引用代理类中:

    protected override WebRequest GetWebRequest(Uri uri)
        {
            HttpWebRequest req = (HttpWebRequest)base.GetWebRequest(uri);            
            req.Headers.Add(HttpRequestHeader.Authorization,
                    "Basic " + "12345678901234567890");
    
            return req;
        }
    

    Web 引用代理类扩展了 System.Web.Services.Protocols.SoapHttpClientProtocol。此类包含对 System.Net.WebRequest.GetWebRequest(Uri uri) 的调用。 WebRequest 允许我们在调用代理类的方法时在请求上设置特定的标头。

    感谢您的帮助!

    【讨论】:

    • 谢谢,这对我帮助很大!仅供使用 VS 2008 的用户参考,为了在 VS 2008 中创建代理类(不会在 asp.net 应用程序中创建代理类),我必须将 Web 引用添加到虚拟控制台应用程序,然后复制我的网络应用程序的代理类。
    【解决方案2】:

    需要进行一些更改。

    首先,有一个方便的常量HttpRequestHeader.Authorization。

    其次,他们是否期望标头是 Base64 编码的 - 这通常是基本身份验证所必需的。

    WebClient.Headers.Add(HttpRequestHeader.Authorization, 
        "Basic " + Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes("12345678901234567890")));
    

    【讨论】:

    • 谢谢!不幸的是,这还没有完全得到它。我仍然看到“401 Unauthorized”异常。我是否需要以其他方式在服务上设置它(从“客户端”转换为“服务”)?
    • 您可以使用 Fiddler 或类似工具查看您的原始请求以检查标头是否存在且正确吗?此外,第三方是否能够帮助诊断不正确的地方(或者他们是否有任何他们需要的文件)?
    • 使用 Fiddler,似乎没有在请求中设置 Header。我将标头添加到 WebClient 而不是服务代理 - 有没有办法添加到服务代理?
    【解决方案3】:

    我正在为现在有这个问题的人写这篇文章。如前面的答案中提到的继承层次结构上升到WebClientProtocol 类,该类具有ICredentials 属性,只需通过NetworkCredential 实例设置此属性,如下所示:

    YourServis.Credentials = new NetworkCredential("UserName", "Password", "Domain");
    

    我认为 taht 是最简单的方法,无需更改 Reference.cs 或添加标题。

    【讨论】:

      猜你喜欢
      • 2013-01-29
      • 2017-05-24
      • 2020-12-06
      • 2017-05-19
      • 1970-01-01
      • 2023-01-26
      • 2023-03-23
      • 1970-01-01
      相关资源
      最近更新 更多