我必须将对WCF服务的调用转换为传统的VB6应用程序。为此,我引用了一个c#dll来调用wcf方法。在dll我设置配置而不是使用配置文件。当我运行单元测试时,dll会起作用,但是一旦我在vb6应用程序中执行它,我就会收到以下错误:
System.Net.WebException:远程服务器返回错误:(401)未经授权。 在System.Net.HttpWebRequest.GetResponse() 在System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest。 WaitForReply(TimeSpan超时)HTTP请求未经授权使用客户端身份验证方案“Basic”。从服务器收到的身份验证标头是“Negotiate,NTLM,Basic realm = [ip]
该服务正在使用基本身份验证。在这两种情况下,我使用相同的URL,用户名和密码。这是我在代码中所做的配置:
BasicHttpBinding binding = new BasicHttpBinding
{
SendTimeout = TimeSpan.FromMinutes(1),
OpenTimeout = TimeSpan.FromMinutes(1),
CloseTimeout = TimeSpan.FromMinutes(1),
ReceiveTimeout = TimeSpan.FromMinutes(10),
AllowCookies = false,
BypassProxyOnLocal = false,
HostNameComparisonMode = HostNameComparisonMode.StrongWildcard,
MessageEncoding = WSMessageEncoding.Mtom,
TextEncoding = System.Text.Encoding.UTF8,
TransferMode = TransferMode.Buffered,
UseDefaultWebProxy = true,
};
binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
var wcf = new [servicename](binding, new EndpointAddress([the url]));
if (wcf .ChannelFactory.Credentials != null)
{
wcf .ChannelFactory.Credentials.UserName.UserName = [the username];
wcf .ChannelFactory.Credentials.UserName.Password = [the pw];
}
我无法弄清楚VB6应用程序执行时有什么不同。任何意见都表示赞赏。
答案 0 :(得分:0)
C#DLL已注册为com interop。我曾经假设它是通过vb6调用的副产品,但是我退后一步并意识到vc6正确提供了wcf凭据,但它在dll中遵循的代码路径略有不同而且它们不是正确应用。
似乎总是在事情毫无意义的时候,一些潜在的假设是错误的。感谢您的建议。