WCF(401)在引用DLL时未经授权

时间:2012-01-27 03:20:09

标签: c# wcf vb6

我必须将对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应用程序执行时有什么不同。任何意见都表示赞赏。

1 个答案:

答案 0 :(得分:0)

C#DLL已注册为com interop。我曾经假设它是通过vb6调用的副产品,但是我退后一步并意识到vc6正确提供了wcf凭据,但它在dll中遵循的代码路径略有不同而且它们不是正确应用。

似乎总是在事情毫无意义的时候,一些潜在的假设是错误的。感谢您的建议。