WCF over SSL - 404错误

WCF over SSL - 404错误

好的,我一定在这里丢了一些简单的东西,因为我已经在谷歌搜索了几天,并且看了几十个答案,在这里,所以我不能让这个工作,无论我试过了什么。 当通过普通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描述性“ 您已经创建了一个服务 ”页面,这显示了创建您的客户端使用

svcutil.exe https:// ... 

编辑:我意识到在wsdl文件中为svcutil显示的URL实际上是指向Web服务器的物理盒名称,而不是正确的域。 所以我浏览了这个博客帖子中显示的步骤,使用adsutil脚本来更新IIS中的网站的SecureBinding。 现在wsdl文件显示正确的SSL地址,但我仍然收到相同的错误。

现在我去试图挂钩我的Silverlight应用程序,它不起作用,从异步调用的结果中返回异常,表示“ 远程服务器返回错误:NotFound 。我有一些博客通过创建一个测试Windows应用程序,并尝试从中引用它来阅读有关将其缩小到Silverlight问题,那么我做到了这一点,即使在一个常规的Windows应用程序试图通过SSL访问服务,我得到一个例外:

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)

尽管事实上,我明确地将使用HTTPS方案的服务引用添加到Windows应用程序,它正确地获取所有的方法,并在编辑器中显示在Intellisense中。

请注意,这是一项不需要在用户部分显式登录的服务。 我将在我的SOAP信封中发送自定义标头,以验证请求是否来自我们的应用程序,而我只是希望让捕食者不要嗅探线条并选择自定义标题。

现在的代码,我一定只是有一些愚蠢的小错误,因为从我所有的阅读,这应该是一个相当简单的练习。

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

<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然后设置绑定配置我希望这有帮助。

<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>

参考更多解答:WCF over SSL - 404错误,转载请保留WCF over SSL - 404错误

更多:wcf