我在Windows服务环境中自我托管的WCF服务可以在http上正常工作;通过https我无法在运行silverlight应用程序(或只是在IE中打开页面)时看到Windows登录提示而无法访问一个URL。我正在使用IPolicyRetriever接口来确保为Silverlight应用程序找到ClientAccessPolicy.xml文件。这工作正常。
有问题的服务定义了两个端点:
<service behaviorConfiguration="defaultBehavior" name="WCFServices.Scheduler">
<endpoint address="WCFServices/Scheduler/" binding="wsHttpBinding" bindingConfiguration="dBinding" contract="WCFServices.IScheduler" />
<endpoint address="" binding="webHttpBinding" contract="WCFServices.IPolicyRetriever" behaviorConfiguration="PolicyBehavior" bindingConfiguration="dBinding" />
<host>
<baseAddresses>
<add baseAddress="https://myservername.org/" />
</baseAddresses>
</host>
</service>
如果我转到https://myservername.org/
,我会看到测试服务前端(带有指向wsdl的链接)。这暴露了Silverlight应用程序用于下拉策略文件的根IPolicyRetriever实例。我可以在没有任何登录提示的情况下加载显示WCF服务的此URL和其他URL。但是,如果我在IE 8中转到https://myservername.org/WCFServices/Scheduler/
,我会看到Windows登录。如果我重置服务和客户端上的安全设置以使用http,我可以在没有登录提示的情况下转到后一个URL,并且silverlight应用程序按预期运行。我怀疑它与这个WCF服务有关,它是唯一一个定义了两个端点的服务(这个windows服务托管另外5个WCF服务,所有这些服务都只定义了1个端点)。我错过了一些授权规则吗?我不明白这是怎么回事,因为所有其他服务都没有提示加载。
我将不胜感激任何帮助。我需要完整的https://myservername.org/WCFServices/Scheduler/
来提供WCF服务,而无需登录。感谢您花时间阅读本文。
就安全性而言,我只将此作为我的约束力:
<binding name="dBinding" maxBufferPoolSize="524288" maxReceivedMessageSize="6553600">
<security mode="Transport">
</security>
</binding>
答案 0 :(得分:0)
通过将这些行添加到我的安全绑定中解决了此问题:
<security mode="Transport">
<transport clientCredentialType="None" proxyCredentialType="None"/>
</security>
...但这导致了许多其他问题,由于WCF日志记录,我已经能够处理所有这些问题。如果在调试WCF服务时遇到NOT FOUND(400)错误,请不要相信它。打开服务器端调试并填写生成的日志文件 - 您将到达底部。
我还应该注意到,当在Web浏览器中打开时,我发现第二个端点返回错误请求(400),这是BY DESIGN。第一个端点将在其wsdl中列出所有其他端点,您仍然可以在代理生成工具中使用其中任何端点。如果您在尝试直接在浏览器中访问它们时遇到错误的请求错误,请不要担心。