Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 引用Dll时WCF(401)未经授权_C#_Wcf_Vb6 - Fatal编程技术网

C# 引用Dll时WCF(401)未经授权

C# 引用Dll时WCF(401)未经授权,c#,wcf,vb6,C#,Wcf,Vb6,我必须将对WCF服务的呼叫输入到遗留的VB6应用程序中。为此,我引用了一个c#dll来调用wcf方法。在dll中,我正在设置配置,而不是使用配置文件。当我运行单元测试时,dll可以工作,但一旦我在vb6应用程序中执行dll,就会出现以下错误: System.Net.WebException:远程服务器返回错误:(401)未经授权。 在System.Net.HttpWebRequest.GetResponse()中 位于System.ServiceModel.Channels.HttpChanne

我必须将对WCF服务的呼叫输入到遗留的VB6应用程序中。为此,我引用了一个c#dll来调用wcf方法。在dll中,我正在设置配置,而不是使用配置文件。当我运行单元测试时,dll可以工作,但一旦我在vb6应用程序中执行dll,就会出现以下错误:

System.Net.WebException:远程服务器返回错误:(401)未经授权。 在System.Net.HttpWebRequest.GetResponse()中 位于System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest。WaitForReply(TimeSpan超时)HTTP请求未经客户端身份验证方案“Basic”授权。从服务器接收的身份验证标头为“协商,NTLM,基本领域=[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应用程序执行它时,我不知道有什么不同。欢迎任何输入。

C#DLL已注册用于com互操作。我本以为这是通过vb6调用的副产品,但我退了一步,意识到vb6正确地提供了wcf凭据,但它在dll中遵循的代码路径略有不同,并且没有正确地应用它们


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

VB6应用程序运行的凭据是什么?进一步回答Tim的问题。VB6应用程序是否作为服务运行?它是COM组件还是在COM+/component服务中运行?它是由另一个应用程序启动的吗?请尝试在您的服务上启用跟踪,并检查跟踪日志中的消息头,以查找从单元测试调用时传递的用户名/密码以及从VB6应用程序调用时传递的用户名/密码。这应该告诉你为什么会出现401错误