我们有 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 文件中使用代理。
一如既往,任何帮助表示赞赏!谢谢大家。