我有一个小型WCF Web服务,使用内置的WCF服务主机,并通过Visual Studio 2008内置的开发Web服务器进行托管。
我是这些托管环境,我依靠WCF测试客户端来调用服务方法。
现在我遇到了下一阶段测试的问题:
我把它托管在我的WinXP开发机器上的IIS 5.1中,我想可能问题是我不能再继续使用WCF测试客户端了。以下是发生的事情:
案例1:“匿名访问”已检查(已启用)
WCF测试客户端UI正常显示,公开WebMethods和INVOKE按钮。 然而,当我单击INVOKE时,它无法连接需要Windows身份验证的后端数据存储(第三方产品)。我可以发布我从product.DLL返回的错误,但我不认为它是相关的。
案例2:“匿名访问”未经检查(已禁用)
WCF测试客户端UI甚至无法正确初始化。我对此的研究告诉我,MEX(WS-Metadata Exchange)需要“匿名访问”和(显然)WCF测试客户端需要MEX。以下是返回错误的关键代码段:
Error: Cannot obtain Metadata from http://localhost/wcfiishost
The remote server returned an error: (401) Unauthorized.HTTP GET Error
URI: http://localhost/wcfiishost
There was an error downloading 'http://localhost/wcfiishost'.
The request failed with the error message:
Security settings for this service require 'Anonymous' Authentication but it is not enabled for the IIS application that hosts this service
有很多关于绑定选项,消息安全性等的解释以及我老实说不明白的东西。以下是我对自己所处的看法,但我很乐意听取您的意见:
(a)因为我知道我的WCF Web服务必须配置为使用Windows身份验证,所以我得出结论,在IIS中托管我的服务时,我无法继续使用WCF测试客户端。它已经有效地延长了它对我的用处。我只需要花时间编写一个Web客户端,因为如果没有Anonymous,WCFTestClient将无法运行。
(或)
(b)如果它和托管服务是属性配置的话,可以使用WCF测试客户端(我只是不知道特殊配置技术是什么)。
哪个是对的?是时候停止使用WCFTestClient还是有办法让它兼得吗?提前感谢您的建议。
编辑:2009年6月11日
我还能提供什么帮助别人帮我解决这个问题吗?
答案 0 :(得分:0)
我只是尝试使用相同的设置 - 但在我的情况下,一切似乎都运行正常。
我可以使用WcfTestClient轻松连接到它并检索元数据,然后我可以调用它,没问题。
在我的服务功能中,我检查当前用户是否是已知用户,它被正确识别为Windows身份验证用户:
ServiceSecurityContext ssc = ServiceSecurityContext.Current;
if (ssc.IsAnonymous)
{
return "anonymous user";
}
else
{
if(ssc.WindowsIdentity != null)
{
return ssc.WindowsIdentity.Name;
}
if (ssc.PrimaryIdentity != null)
{
return ssc.PrimaryIdentity.Name;
}
}
return "(no known user)";
我真的不知道,还有什么需要检查的(除了我在Vista上使用IIS7)。您是否可以在服务代码中包含此代码以检查用户?只是为了看....
马克
答案 1 :(得分:0)
John使用WSHttpBinding,它使用Windows凭据进行消息模式传输。 Windows身份验证不与BasicHttpBinding一起使用。此外,John禁用了AnonymousAuthentication,这就是元数据交换(mex)失败的原因。
呼叫甚至无法到达服务端功能内部,因为我们在尝试呼叫时收到错误401(未授权)。
只知道John,我有同样的问题,我试图以某种方式为每个端点设置单独的绑定。希望这会奏效。
答案 2 :(得分:0)
当我设置这个问题的标题/主题并在此处达到死胡同时,我在MSDN论坛中打开了同样的问题,对标题的重点不同(问题的内容基本相同)。
对我来说,真正的问题是如何在没有设置匿名身份验证的情况下在IIS中使用WCFTestClient(因为我的服务只需要集成Windows身份验证)。
Mex显然需要Anonymous,默认情况下WCFTestClient似乎需要Mex。关键似乎是在适应我对web.config文件的认真考虑。
无论如何,我使用下面的web.config(the MSDN link is here:
)<?xml version="1.0"?>
<configuration>
<endpoint address=""
binding="wsHttpBinding"
bindingConfiguration="wsBindingConfig"
contract="sdkTrimFileServiceWCF.IFileService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="basic"
binding="basicHttpBinding"
bindingConfiguration="bindingConfig"
contract="sdkTrimFileServiceWCF.IFileService" />
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="bindingConfig">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows"/>
</security>
</binding>
</basicHttpBinding>
<wsHttpBinding>
<binding name="wsBindingConfig">
<security mode="Transport">
<transport clientCredentialType="Windows"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
</serviceBehaviors>
</behaviors>