0

我们有 2 台网络方法服务器,一台可通过我们的内部网络访问,另一台可通过我们的网络外部访问。WSDL 都可以访问,因此我知道服务已启动并正常运行。

以下 .NET 代码在我们的外部服务器上运行时将起作用(因此它正在访问外部 Web 方法服务器)。

public WebMethodsService()
{
    var binding = new BasicHttpBinding(BasicHttpSecurityMode.TransportCredentialOnly);
        binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
   binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;

    var ea = new
            EndpointAddress(ConfigurationManager.AppSettings["WebMethodsServer"]);

    _client = new vendorSelfService_PortTypeClient(binding, ea);

    if (_client.ClientCredentials != null)
    {
        _client.ClientCredentials.UserName.UserName = ConfigurationManager.AppSettings["WebMethodsUserName"];
        _client.ClientCredentials.UserName.Password = ConfigurationManager.AppSettings["WebMethodsPassword"];
    }

    _timeout = int.MaxValue.ToString(CultureInfo.InvariantCulture);
    _port = ConfigurationManager.AppSettings["WebMethodsInvokeUriPort"];
    _url = ConfigurationManager.AppSettings["WebMethodsInvokeUri"];
}

public bool ValidateUser(string userName, string password)
{
    var find = new ValidateUser
    {
        userName = userName,
        password = password
    };

    fault17 foundFault;
    transportInfo17 transportInfo;
    var response = _client.ISearch_ValidateUser(find, null, _timeout, _port, _url, null, out foundFault, out transportInfo);
    ProcessWebMethodsResponse(response, foundFault, transportInfo);

    return response.ValidateUserResult;
}

public void ProcessWebMethodsResponse(object results, object fault, object info)
{
    if (fault != null)
    {
        var correctFault = new fault();
        WebMethodsMapper.MapProperties(fault, correctFault);

        var correctTransport = new transportInfo();
        WebMethodsMapper.MapProperties(info, correctTransport);

        var anyFaults = correctFault.ToFaultString(correctTransport);
        if (!string.IsNullOrEmpty(anyFaults))
        {
            throw new WebException(anyFaults);
        }
    }

    if (results == null)
    {
        throw new InvalidDataException("Cannot find results...");
    }
}

当我尝试在本地机器上通过 Visual Studio 的 IDE 运行代码时,就会出现问题。我一直收到以下错误:

在此处输入图像描述

我的研究表明使用 .NET 和 Web 方法存在问题。.NET 不会按照 Web 方法所期望的方式协商身份验证。

如果有帮助,则只有在我向代理添加例外时,才能在 Internet Explorer 的浏览器中访问 WSDL。我不知道在这段代码中我会在哪里执行此操作...我假设.NET 将获取我的代理异常,特别是如果我根本没有告诉它在 web.config 文件中使用代理。

一如既往,任何帮助表示赞赏!谢谢大家。

4

1 回答 1

0

这是权限问题。您的 Web 服务的read权限可能设置为Anonymous,这意味着任何人都可以看到它的 WSDL,但它的execute权限设置为其他内容。要确认这一点,请将execute权限设置为Anonymous,然后重试。

然后是您希望如何传递凭据的问题;也许首先创建一个 IS 用户,将其添加到一个组并将该组设置为 Web 服务的执行权限;然后将该用户的用户名和密码硬编码到您的代码中。

一旦它起作用并且你很高兴,我建议如果它需要身份验证/授权,则为真实系统设置单点登录(例如 SAML?)。

于 2013-10-30T13:12:02.683 回答