Silverlight:在非标准SSL端口上访问SSL WCF服务

时间:2009-07-31 17:14:07

标签: wcf silverlight ssl

我已经制作了一份我的制作网站的副本用于分期目的。我的Silverlight应用程序在端口81上提供,并尝试通过端口2443上的SSL访问WCF服务。我已通过键入URL验证了该服务是否可访问:

https://mydomain.com:2443/UtilService.svc - 我收到了“您已创建服务”页面。

但是当我的SL应用程序尝试对服务执行操作时,我在Web服务客户端代码的End部分中得到了着名的“NotFound”异常:

   {System.ServiceModel.CommunicationException: The remote server returned an error: NotFound. ---> System.Net.WebException: The remote server returned an error: NotFound. ---> System.Net.WebException: The remote server returned an error: NotFound.
   at System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult)
   at System.Net.Browser.BrowserHttpWebRequest.<>c__DisplayClass5.<EndGetResponse>b__4(Object sendState)
   at System.Net.Browser.AsyncHelper.<>c__DisplayClass2.<BeginOnUI>b__0(Object sendState)
   --- End of inner exception stack trace ---
   at System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state)
   at System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
   at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteGetResponse(IAsyncResult result)
   --- End of inner exception stack trace ---
   at System.ServiceModel.AsyncResult.End[TAsyncResult](IAsyncResult result)
   at System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.End(SendAsyncResult result)
   at System.ServiceModel.Channels.ServiceChannel.EndCall(String action, Object[] outs, IAsyncResult result)
   at System.ServiceModel.ClientBase`1.ChannelBase`1.EndInvoke(String methodName, Object[] args, IAsyncResult result)
   at UtilServiceClient.UtilServiceClientChannel.EndTryAutoLogon(IAsyncResult result)
   at UtilServiceClient.UtilServiceReference.IUtilService.EndTryAutoLogon(IAsyncResult result)
   at UtilServiceClient.OnEndTryAutoLogon(IAsyncResult result)
   at System.ServiceModel.ClientBase`1.OnAsyncCallCompleted(IAsyncResult result)}

我修改了clientaccesspolicy.xml,如下所示:

<access-policy>
  <cross-domain-access>
    <policy>
      <allow-from http-request-headers="*">
        <domain uri="http://*.mydomain.com:81"/>
        <domain uri="https://*.mydomain.com:2443"/>
      </allow-from>
      <grant-to>
        <resource path="/" include-subpaths="true"/>
      </grant-to>
    </policy>
  </cross-domain-access>
</access-policy>

其他注意事项:

  • 生产站点在443上提供相同的服务,没有任何问题

  • 使用fiddler,我已经确认CONNECT:2443会在合适的时间出现。

  • 我关闭了IIS中的SSL要求并修改了WCF配置以删除传输安全性,并修改了SL应用以访问端口81上的服务 - 并且它可以正常工作。

  • 我正在运行IIS 6.

我是否需要通过端口2443访问服务?

2 个答案:

答案 0 :(得分:4)

叹息。它与Silverlight无关:问题是服务端点上的地址过滤过于严格。我将以下内容添加到我的服务类中,一切正常:

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]

我通过为服务创建Windows客户端来发现这一点,该客户端返回了有关错误的更多信息。这个故事的寓意是:不要依赖Silverlight来给你全部图片!

答案 1 :(得分:0)