我一直在google搜索我可能找到的任何地方(包括这里的Stackoverflow),以找出我尝试将WCF服务部署到Windows 7 x64上的IIS 7.5上的错误,该服务仅通过基本HTTP身份验证的SSL运行。我在IIS中有一个站点,它具有绑定到端口50443的HTTPS以及自签名证书。 (我不能使用标准端口443,因为我们计划在已经运行Tomcat的服务器上将其部署到IIS,该服务器正在监听80和443.)
这是web.config:
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding name="SSLBinding">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Basic"/>
</security>
</binding>
</basicHttpBinding>
</bindings>
<services>
<service name="HelloWorldWcf.HelloWorldWcfService">
<endpoint name="HelloWorldWcf.HelloWorldWcfService"
address="https://mylaptop:50443/HelloWorld/Service1.svc"
binding="basicHttpBinding"
bindingConfiguration="SSLBinding"
contract="HelloWorldWcf.IHelloWorldWcfService"/>
<endpoint address="https://mylaptop:50443/HelloWorld/Service1.svc/mex"
binding="mexHttpsBinding"
contract="IMetadataExchange"/>
</service>
</services>
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
如果我浏览服务端点地址并手动输入基本身份验证凭据,则会在浏览器中显示以下异常错误消息:
提供的URI方案“https”无效;预期'http'。
参数名称:context.ListenUriBaseAddress
这是我尝试针对类似服务运行WCF客户端时出现的相同错误,除了它以“参数名称:via”结尾(因为调用堆栈中显示的方法的参数名称为“System”) .ServiceModel.Channels.TransportChannelFactory`1.ValidateScheme(URI via)“,实际上是”via“)。
我已经调整了服务器和客户端配置文件很多次我失去了跟踪,但上面的web.config文件是我迄今为止最好的猜测 - 它甚至不能在浏览器中运行,更不用说了WCF客户端。
通过HTTPS进行基本HTTP身份验证,在非标准SSL端口上访问IIS 7.5中托管的WCF服务需要做什么?救命! (&谢谢!)
答案 0 :(得分:5)
尝试将此添加到绑定
<security mode="Transport">
<transport clientCredentialType="None" proxyCredentialType="None" realm=""/>
<message clientCredentialType="Certificate" algorithmSuite="Default" />
</security>
答案 1 :(得分:4)
Arrrrgh!好的,让它继续工作的其余步骤:
替换我的&lt; security&gt; web.config中的节点,带有burning_LEGION的。
从web.config中删除“mex”端点。 (这使我能够在我的浏览器中找到通常的“你已经创建了一个服务”友好的网页。)
在“DOMAIN \ username”字符串中转义反斜杠,我在客户端C#代码中分配给HelloWorldWcfServiceClient.ClientCredentials.UserName.UserName。 (我说“arrrrgh!”?男人,我的脸红了。)这消除了我在步骤1和2之后得到的错误:
System.ServiceModel.Security.MessageSecurityException:“HTTP 请求未经授权使用客户端身份验证方案'Basic'。该 从服务器收到的身份验证标头是'基本的 境界= “mylaptop”” ---&GT; System.Net.WebException:远程服务器 返回错误:(401)未经授权。
我从here得到了第2步的想法,这让我觉得mex对HTTPS不满意,对于here的第3步,我注意到用户名是@“domain \ username”,不是“域\用户名”。
+1 to burning_LEGION for the assist!
所以,未回答的问题:(1)为什么安全/消息节点对不使用消息安全性的配置(仅传输安全性)有任何影响? (2)如果mex端点干扰正常操作,它的重点是什么? (3)如果mode =“TransportCredentialOnly”不能与HTTPS一起使用,为什么我没有收到错误指示?