【问题标题】:Pre authenticate web service request in C#在 C# 中预先验证 Web 服务请求
【发布时间】:2018-04-24 16:35:50
【问题描述】:

我在用 C# 调用 Web 服务请求时遇到问题。

服务和请求在 Soap UI 中运行良好,启用了“预先验证”选项(文件、首选项、HTTP 设置)。如果不启用此设置,服务将返回“Java.Lang.NullPointerException”。

我遇到的问题是我不知道如何在 C# 上下文中启用此设置。

我有一个 .NET 3.5 类库,其中包含对特定服务的所谓服务引用。这是一个简单的代码sn -p;

try
{
    CatalogService.CatalogChangeClient service = new CatalogService.CatalogChangeClient();
    service.ClientCredentials.UserName.UserName = "fancydress";
    service.ClientCredentials.UserName.Password = "47fda9cb4b51a9e";
    service.ClientCredentials.SupportInteractive = true;

    ProductUpdate[] products = new ProductUpdate[1];
    products[0] = new ProductUpdate();
    products[0].ProductCode = "00001";
    products[0].ProductDescription = "TestProduct";

    string result = service.UpdateProducts(products);
}
catch (Exception exception)
{
    Console.WriteLine(exception.Message);
}

第一次回复后更新。

CatalogService.CatalogChangeClient 类似乎实现了 WCF 抽象类

System.ServiceModel.ClientBase<TChannel>

结束更新

谁能帮我设置这个属性?

【问题讨论】:

  • 请显示更多代码,尤其是。接口CatalogService.CatalogChangeClient实现
  • 它似乎正在从 WCF 实现 System.ServiceModel.ClientBase 类: public partial class CatalogChangeClient : System.ServiceModel.ClientBase, Fancydress.ResourceAccess.MCSF .CatalogService.CatalogChange
  • 据我所知,这是 .NET 实现中的一个问题,它会发送请求,并且只有当它从服务中获得 401 时才会使用凭据重新发送...您的 Java WebService 似乎没有发送401 - 虽然你应该首先确认情况确实如此(即WireShark)......如果是这样:为了规避这个我怀疑你将不得不使用一个不同的客户端(代理),它可以被“欺骗”发送凭据总是...
  • Yahia,你是正确的。使用 WireShark,我能够确认 java web 服务没有发送 401。所以是的,我需要一个不同的代理来始终发送凭据。谢谢!

标签: c# web-services


【解决方案1】:

您可以尝试从生成的客户端存根中覆盖GetWebRequest 方法。我用过一次,解决了我的问题。

查看以下网址:

http://www.eggheadcafe.com/community/wcf/18/10056093/consuming-webservices-and-http-basic-authentication.aspx

向下滚动一点。

这是链接中的代码:

protected override System.Net.WebRequest GetWebRequest(Uri uri)
{
    HttpWebRequest request;
    request = (HttpWebRequest)base.GetWebRequest(uri);

    if (PreAuthenticate)
    {
        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);
        }
        else
        {
            throw new ApplicationException("No network credentials");
        }
    }
    return request;
}

【讨论】:

  • .NET WebRequest.PreAuthenticate – not quite what it sounds like 上有一篇很好的文章,它更详细地描述了您的答案和其他选项。
  • 我认为你需要一个额外的空间:request.Headers["Authorization"] = "Basic " + ... 否则 +1
  • @Julia Hayward - 真的,应该去过那里。
  • GetWebRequest 方法在哪里?
  • System.ServiceModel.ClientBase 没有 GetWebRequest,那么您在哪里进行了此覆​​盖? ?
猜你喜欢
  • 2023-03-24
  • 1970-01-01
  • 2013-01-27
  • 2017-04-02
  • 2014-06-21
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 2015-04-19
相关资源
最近更新 更多