WCF通过SSL – 404错误

好吧,我一定在这里错过了一些非常简单的事情,因为我一直在Google上search几天,然后在那里看到几十个答案,而且在这里,无论我尝试了什么,我都无法得到这个工作。 当通过简单的HTTP调用时,该服务工作得很好。

这是我们的设置…我们有一个域名http://www.mydomain.com 。 我们在thawte上安装了SSL证书,就像我们保护电子商务网站一样。 这一切工作正常,我可以去http://www.mydomain.com,它的工作原理是正确的。 我在Windows Server 2003 R2上运行VS2008,.NET 3.5站点。

现在,我添加了一个支持Silverlight的WCF服务到我的站点,我想通过SSL进行通信。 如果我浏览到http://www.mydomain.com/myservice.svc,它会按照预期向我显示WSDL描述性的“ 您已经创build了一个服务 ”页面,该页面显示了如何创build您的客户端

svcutil.exe https:// ... 

编辑:我意识到在wsdl文件中显示的svcutil的url实际上是指向web服务器的物理框名称,而不是正确的域。 所以我经历了这篇博文中显示的步骤,以使用adsutil脚本来更新IIS中网站的SecureBinding。 现在wsdl文件显示正确的SSL地址,但我仍然得到相同的错误。

现在我去了,试图挂钩我的Silverlight应用程序,它不起作用,从asynchronous调用的结果中返回一个exception,指出“ 远程服务器返回一个错误:NotFound 。我的一些博客通过创build一个testing的Windows应用程序,并试图从中引用它,然后讨论了如何将它缩小到Silverlight问题。那么,我甚至在一个正常的Windows应用程序试图通过SSL访问服务,我得到一个exception,指出:

 System.ServiceModel.EndpointNotFoundException: There was no endpoint listening at https://www.mydomain.com/mysubdir/myservice.svc that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details. ---> System.Net.WebException: The remote server returned an error: (404) Not Found. at System.Net.HttpWebRequest.GetResponse() at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout) 

尽pipe我明确地使用HTTPSscheme将服务引用添加到Windows应用程序,并且它正确地获取了所有方法,并在编辑器的Intellisense中显示它们。

请注意,这是一个服务,不需要明确login用户的一部分。 我将在我的SOAP信封中发送自定义标题,以validation请求是来自我们的应用程序,我只是想保持捕食者从嗅探线和挑选自定义标题。

现在到代码中,我必须有一些愚蠢的小设置错误,因为从我读过的所有,这应该是一个相当简单的练习。

首先,我的服务的代码隐藏类用以下属性装饰:

 <ServiceBehavior(AddressFilterMode:=AddressFilterMode.Any)> <AspNetCompatibilityRequirements(RequirementsMode:=AspNetCompatibilityRequirementsMode.Allowed)> 

服务器上的web.config的ServiceModel部分如下所示:

 <system.serviceModel> <bindings> <basicHttpBinding> <binding name="basicHttpBinding"> <security mode="Transport"> <transport clientCredentialType ="None"/> </security> </binding> </basicHttpBinding> </bindings> <behaviors> <serviceBehaviors> <behavior name="standingsBehavior"> <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="false"/> </behavior> </serviceBehaviors> </behaviors> <serviceHostingEnvironment aspNetCompatibilityEnabled="true"> <baseAddressPrefixFilters> <add prefix="http://www.mydomain.com:80"/> </baseAddressPrefixFilters> </serviceHostingEnvironment> <services> <service behaviorConfiguration="standingsBehavior" name="lijslwebdata"> <endpoint address="" binding="basicHttpBinding" contract="lijslwebdata"/> <!--<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>--> </service> </services> </system.serviceModel> 

我的Windows应用程序中的app.config的ServiceModel部分如下所示:

 <system.serviceModel> <bindings> <basicHttpBinding> <binding name="BasicHttpBinding_lijslwebdata" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true"> <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> <security mode="Transport"> <transport clientCredentialType="None" proxyCredentialType="None" realm=""/> <message clientCredentialType="UserName" algorithmSuite="Default" /> </security> </binding> </basicHttpBinding> </bindings> <client> <endpoint address="https://www.mydomain.com/mysubdir/myservice.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_lijslwebdata" contract="xdata.lijslwebdata" name="BasicHttpBinding_lijslwebdata" /> </client> </system.serviceModel> 

我在这个问题上有同样的问题。 你的文章帮助我找出问题所在。 这里是我的服务模型部分。 我发现的关键是httpsGetEnabled然后设置绑定configuration,我希望这可以帮助。

 <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="RequestImageBehavior"> <serviceMetadata **httpsGetEnabled**="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> <dataContractSerializer maxItemsInObjectGraph="1073741824" /> </behavior> </serviceBehaviors> </behaviors> <services> <service behaviorConfiguration="RequestImageBehavior" name="RequestImage"> <endpoint address="" binding="wsHttpBinding" **bindingConfiguration**="HttpsBinding" contract="IRequestImage"> </endpoint> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> </service> </services> <bindings> **<wsHttpBinding> <binding name="HttpsBinding"> <security mode="Transport"> <transport clientCredentialType="None"/> </security> </binding> </wsHttpBinding>** </bindings> </system.serviceModel> 

我最近正在处理这个问题,并想添加一个调整。 如果按照上面的说明操作,则可以使服务与HTTPS一起使用,但不能同时在HTTP和HTTPS上使用。 为此,您需要有两个端点configuration节点,每个协议一个,如下所示:

  <service name="MyCompany.MyService" > <endpoint address="" behaviorConfiguration="AspNetAjaxBehavior" binding="webHttpBinding" contract="MyCompany.MyService" bindingConfiguration="sslBinding" /> <endpoint address="" behaviorConfiguration="AspNetAjaxBehavior" binding="webHttpBinding" contract="MyCompany.MyService" /> </service> 

(取自我的代码库,根据需要调整behaviorConfiguration和绑定)

我刚刚花了几个小时,事实certificate我的问题是服务名称

 <services> <service name="TimberMill.Web.Data.LogReceiverService"> <endpoint binding="basicHttpBinding" bindingConfiguration="basicBinding" contract="NLog.LogReceiverService.ILogReceiverServer" /> </service> </services> 

必须与我的* .svc文件中的类似条目完全匹配。

 <%@ ServiceHost Language="C#" Debug="true" Service="TimberMill.Web.Data.LogReceiverService, TimberMill.Web" Factory="Autofac.Integration.Wcf.AutofacServiceHostFactory, Autofac.Integration.Wcf" CodeBehind="LogReceiverService.svc.cs" %> 

我不确定是否与我使用Autofac相关。 这一切工作正常HTTP下。 虽然在HTTPS下失败。

那么我想是的,我现在不想通过testing更加详细地干扰任何事情,以免愤怒WCF-Config神,我的configuration再次破裂。 因人而异。

在我的情况下,这些答案没有帮助。

相反,我需要添加一个没有name属性集的重复的<binding>部分 。

这里是我的服务的web.config文件的适当部分的转储:

 <behaviors> <serviceBehaviors> <behavior name="ServiceBehaviour"> <serviceMetadata httpsGetEnabled="true" httpsGetUrl="RemoteSyncService.svc" httpGetBindingConfiguration="bindingConfig" /> <serviceDebug includeExceptionDetailInFaults="true" /> </behavior> <behavior name=""> <serviceMetadata httpsGetEnabled="true" httpsGetUrl="RemoteSyncService.svc" /> <serviceDebug includeExceptionDetailInFaults="true" /> </behavior> </serviceBehaviors> </behaviors> <bindings> <basicHttpBinding> <binding name="bindingConfig" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" transferMode="Streamed"> <security mode="Transport"> <transport clientCredentialType="None"/> </security> <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/> </binding> <!-- Add binding with EMPTY/MISSING name, see https://forums.iis.net/t/1178173.aspx --> <binding maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" transferMode="Streamed"> <security mode="Transport"> <transport clientCredentialType="None"/> </security> <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/> </binding> </basicHttpBinding> </bindings> 

我希望这有助于某个人。

我有同样的问题,并花了一天的时间来解决这个问题。 最后下面的configuration工作我的HTTPS访问。

 <system.serviceModel> <bindings> <basicHttpBinding> <binding name="basicHttpBinding"> </binding> <binding name="basicHttpsBinding"> <security mode="Transport"> <transport clientCredentialType ="None"/> </security> </binding> </basicHttpBinding> </bindings> <behaviors> <serviceBehaviors> <behavior name="standingsBehavior"> <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="false"/> </behavior> </serviceBehaviors> </behaviors> <serviceHostingEnvironment aspNetCompatibilityEnabled="true"> <baseAddressPrefixFilters> <add prefix="http://www.mydomain.com/"/> </baseAddressPrefixFilters> </serviceHostingEnvironment> <services> <service behaviorConfiguration="standingsBehavior" name="lijslwebdata"> <endpoint address="" binding="basicHttpBinding" contract="lijslwebdata"/> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> </service> <service behaviorConfiguration="standingsBehavior" name="sslwebdata"> <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttpsBinding" contract="sslwebdata"/> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> </service> </services> </system.serviceModel> 

一切似乎都很有效,根本没有明显的错误…

只有一个观察/问题:你的* .svc文件位于哪里?

在错误消息中,我看到:

  https://www.mydomain.com/myservice.svc 

您的* .svc文件是否真的在您的网站的顶级虚拟目录?

通常,* .svc文件位于IIS上的虚拟目录中,因此地址将如下所示:

  https://www.mydomain.com/YourVirtualDirectory/myservice.svc 

当然,您可以将ASP.NET应用程序和WCF服务* .svc文件部署到您的IIS的根目录,但根据我的经验,这不是很常见。

只是一个thingie检查…..

渣子

好吧,我明显地解决了这个问题,我完全不知道为什么/如何。

这是我做的。

  • 我添加了一个全新的EMPTY启用Silverlight的WCF服务
  • 然后我更新了web.config以反映这两个服务
  • 然后我直接复制粘贴第一个服务的所有内容到第二个服务中,除了名字。

为什么这个固定它,我绝对没有想法。

FWIW为任何人,这里是我的新web.config ServiceModel部分与第二个服务在它…

 <system.serviceModel> <bindings> <basicHttpBinding> <binding name="basicHttpBinding"> </binding> <binding name="basicHttpsBinding"> <security mode="Transport"> <transport clientCredentialType ="None"/> </security> </binding> </basicHttpBinding> </bindings> <behaviors> <serviceBehaviors> <behavior name="standingsBehavior"> <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="false"/> </behavior> </serviceBehaviors> </behaviors> <serviceHostingEnvironment aspNetCompatibilityEnabled="true"> <baseAddressPrefixFilters> <add prefix="http://www.mydomain.com/"/> </baseAddressPrefixFilters> </serviceHostingEnvironment> <services> <service behaviorConfiguration="standingsBehavior" name="lijslwebdata"> <endpoint address="" binding="basicHttpBinding" contract="lijslwebdata"/> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> </service> <service behaviorConfiguration="standingsBehavior" name="sslwebdata"> <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttpsBinding" contract="sslwebdata"/> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> </service> </services> </system.serviceModel> 

它之前没有为你工作,因为你命名你的basicHttpBindingconfiguration“basicHttpBinding”,但没有引用你的标签中的configuration与bindingConfiguration =“basicHttpBinding”

在通过添加另一个服务configuration而工作的更改中,您确实引用了包含该节点的绑定configuration,从而导致其工作。

只是另一件事来检查你是否遇到相同的404错误作为OP。 我摆弄了很多东西,但最终解决scheme归结为仅添加命名空间到我的服务web.config。

所以普通的旧的ServiceFoo和IServiceFoo不起作用:

  <services> <service behaviorConfiguration="quuxBehavior" name="ServiceFoo"> <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttpsBinding" contract="IServiceFoo"/> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> </service> </services> 

但是添加命名空间(ProjectBar)DID工作:

  <services> <service behaviorConfiguration="quuxBehavior" name="ProjectBar.ServiceFoo"> <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttpsBinding" contract="ProjectBar.IServiceFoo"/> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> </service> </services>