2010-06-10 103 views
0

我有一个SL3应用程序试图连接到一个WFC服务。应用程序和服务都位于同一个域中的不同安全服务器上。该SL3应用程序住在这里:的Silverlight 3与WCF服务 -

https://www-r.aetc.af.mil/fm/tools/batsnet/authenticated/modules/blah等等

当SL应用程序启动时,它立即连接到服务,但是当它使得它的第一个电话到服务,我得到这个异常:

An exception occurred during the operation, making the result invalid. Check InnerException for exception details. 
    at System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary() 
    at FMDashboard2.FMDashSvc3Ref.GetMetricDataCompletedEventArgs.get_Result() 
    at FMDashboard2.Objects.DataRetrieval.service_GetMetricDataCompleted(Object sender, GetMetricDataCompletedEventArgs e) 
============ 
Inner exception: An error occurred while trying to make a request to URI 'https://bats.aetc.af.mil/fm/tools/FMDashSvc/FMDash3.svc'. This could be due to attempting to access a service in a cross-domain way without a proper cross-domain policy in place, or a policy that is unsuitable for SOAP services. You may need to contact the owner of the service to publish a cross-domain policy file and to ensure it allows SOAP-related HTTP headers to be sent. This error may also be caused by using internal types in the web service proxy without using the InternalsVisibleToAttribute attribute. Please see the inner exception for more details. 
    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 FMDashboard2.FMDashSvc3Ref.FMDash3Client.FMDash3ClientChannel.EndGetMetricData(IAsyncResult result) 
    at FMDashboard2.FMDashSvc3Ref.FMDash3Client.FMDashboard2.FMDashSvc3Ref.FMDash3.EndGetMetricData(IAsyncResult result) 
    at FMDashboard2.FMDashSvc3Ref.FMDash3Client.OnEndGetMetricData(IAsyncResult result) 
    at System.ServiceModel.ClientBase`1.OnAsyncCallCompleted(IAsyncResult result) 
============ 
Inner exception: 
    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) 
============ 
Inner exception: Security error. 
    at System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult) 
    at System.Net.Browser.BrowserHttpWebRequest.c__DisplayClass5.b__4(Object sendState) 
    at System.Net.Browser.AsyncHelper.c__DisplayClass2.b__0(Object sendState)

这里是我的ClientConfig:

<configuration> 
    <system.serviceModel> 
     <bindings> 
      <customBinding> 
       <binding name="SecureBinding_FMDashSvc"> 
        <binaryMessageEncoding /> 
        <httpsTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" /> 
       </binding> 
       <binding name="LocalBinding_FMDashSvc"> 
        <binaryMessageEncoding /> 
        <httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" /> 
       </binding> 
      </customBinding> 
     </bindings> 

     <client> 
      <endpoint address="https://bats.aetc.af.mil/fm/tools/FMDashSvc/FMDash3.svc" 
         binding="customBinding" 
         bindingConfiguration="SecureBinding_FMDashSvc" 
         contract="FMDashSvc3Ref.FMDash3" 
         name="SecureEndPoint_FMDashSvc_GDIT_BATS" /> 
      <endpoint address="http://localhost:53519/FMDash3.svc" 
         binding="customBinding" 
         bindingConfiguration="LocalBinding_FMDashSvc" 
         contract="FMDashSvc3Ref.FMDash3" 
         name="LocalEndPoint_FMDashSvc" /> 
     </client> 
    </system.serviceModel> 
</configuration>

这里是我的服务网络配置:

<system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="FMDashboardSvc3.StandardBehavior" > 
       <serviceMetadata httpsGetEnabled="true" /> 
       <serviceDebug includeExceptionDetailInFaults="true" /> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 

    <bindings> 
     <wsHttpBinding > 
      <binding name="secureBinding"> 
       <security mode="Transport"> 
        <transport clientCredentialType="Certificate" /> 
       </security> 
      </binding> 
     </wsHttpBinding> 
    </bindings> 

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 

    <services > 
     <service name="FMDashboardSvc3.FMDash3" behaviorConfiguration="FMDashboardSvc3.StandardBehavior"> 
      <endpoint address="/" 
         binding="wsHttpBinding" 
         bindingConfiguration="secureBinding" 
         contract="FMDashboardSvc3.FMDash3" /> 
     </service> 
    </services> 
</system.serviceModel> 

这是我的ClientAccessPolicy.xml文件:

<?xml version="1.0" encoding="utf-8" ?> 
<access-policy> 
    <cross-domain-access> 
     <policy> 
      <allow-from http-request-headers="SOAPAction"> 
       <domain uri ="http://*" /> 
       <domain uri ="https://*" /> 
      </allow-from> 
      <grant-to> 
       <resource path="/" include-subpaths="true"/> 
      </grant-to> 
     </policy> 

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

我一直工作在这几个星期。我锤击Codeproject和MSDN论坛,没有人能够为我提供解决方案。帮助我,obi-wan-kenobi。

+0

是否使用自签名的证书或实际证书? – 2010-06-10 19:34:39

+0

我相信他们是真正的证书。这是一个空军域,他们使用CAC卡进行用户身份验证。 – jsop 2010-06-11 11:33:53

+0

顺便说一句,我没有提到它,但我可以直接浏览到服务,但通过Silverlight应用程序击中它拒绝工作。 – jsop 2010-06-11 11:57:19

回答

0

我认为这个问题可能与服务器端的clientCredentialType有关。例如:

<security mode="Transport"> 
    <transport clientCredentialType="Certificate" /> 
</security> 

我不认为Silverlight支持传输级的这种客户端凭证。

+0

好吧,如果我将其更改为任何其他凭证类型,我无法直接浏览到该服务。 – jsop 2010-06-11 11:56:03

0

您将您的服务公开为Silverlight不支持的Ws绑定。如果你用basicHttpBinding使用相同的安全设置,它应该可以工作。