这让我发疯了。 我正在尝试通过ASP.NET Web表单访问WCF服务, 我正在设置channelfactory的绑定,如下所示:
BasicHttpBinding b = null;
if (Communication.SlServiceURL.StartsWith("https"))
b = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
else
{
b = new BasicHttpBinding();
b.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
}
b.MaxBufferSize = 2147483647;
b.MaxReceivedMessageSize = 2147483647;
b.Security.Transport = new HttpTransportSecurity { ClientCredentialType = HttpClientCredentialType.Ntlm, ProxyCredentialType = HttpProxyCredentialType.None };
b.Security.Message = new BasicHttpMessageSecurity { ClientCredentialType = BasicHttpMessageCredentialType.UserName };
然后我通过
创建一个新的Channel Wrapperpublic ClientChannelWrapper(Binding binding, EndpointAddress remoteAddress)
{
m_Factory = new ChannelFactory<T>(binding, remoteAddress);
}
我正在传递绑定和https:// [myservice] /myservice.svc URL作为remoteAddress。
问题是:当我使用IIS 7在我的生产服务器中调用服务时,在站点上启用了Windows身份验证,并且只有“NTLM”作为身份验证的提供者,其他所有内容都被禁用(没有匿名,表单等) 我得到了例外:
异常类型:MessageSecurityException
异常消息:HTTP请求未经授权使用客户端身份验证方案“Ntlm”。从服务器收到的身份验证标头是“NTLM”。
这很奇怪,我似乎无法找到解决方法。我还有一个在另一个ASP.NET表单中托管的silverlight应用程序,它在这个绑定工作正常,这让我感到非常震惊,因为为什么同样的东西在同一个IIS站点中托管的ASP.NET站点中工作。
同样奇怪:当从Visual Studio使用F5启动站点时,它在IIS7计算机中访问生产WCF服务时有效。一旦我部署了网站,我就会得到例外。
编辑:现在很清楚为什么Silverlight的行为与ASP.NET不同,因为Silverlight直接通过客户端计算机与服务进行通信。除了例外,仍然没有运气。