0
votes

I've got a SL3 app trying to connect to a WFC service. Both the app and the service are on different secure servers on the same domain. The SL3 app lives here:

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

When the SL app starts, it immediately connects to the service, but when it makes it's first call into the service, I get this exception:

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)

Here's my 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>

Here's my web config for the service:

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

And here's my ClientAccessPolicy.xml file:

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

I've been working on this for WEEKS. I've hammer both Codeproject and the MSDN forums, and nobody's been able to come up with a solution for me. Help me, obi-wan-kenobi.

2
Are you using self-signed certs or actual certs?Dan Auclair
I believe they're actual certificates. It's an Air Force domain and they use CAC cards for user authenticaton.jsop
BTW, I didn't mention it, but I can browse directly to the service, but hitting it through the Silverlight app refuses to work.jsop

2 Answers

0
votes

I think the problem may be related to the clientCredentialType on your server side. E.g.:

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

I don't think Silverlight supports this kind of client credential at the transport level.

0
votes

You exposed your service as a Ws Binding which Silverlight does not suppourt. If you use the same secuity settings with basicHttpBinding it should work however.