Подключение к сервису Windows WCF для Silverlight - PullRequest
1 голос
/ 14 октября 2010

Я пытаюсь подключиться к существующему сервису WCF из silverlight (я пробовал silverlight 4 и 3, так что ответ на любой из них был бы хорош), который запускается через службу Windows (хотя я просто запускаю его из командной строкипроект), а не IIS, и я получаю следующую ошибку, которая выглядит так, как будто это относится к clientaccesspolicy.xml:

{System.ServiceModel.CommunicationException: An error occurred while trying to make a request to URI 'http://localhost:8082/SecurityService'. 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. ---> System.Security.SecurityException ---> System.Security.SecurityException: Security error.
   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.EndCall(String action, Object[] outs, IAsyncResult result)
   at System.ServiceModel.ClientBase`1.ChannelBase`1.EndInvoke(String methodName, Object[] args, IAsyncResult result)
   at SilverlightApplication1.ServiceReference1.SecurityServiceClient.SecurityServiceClientChannel.EndGetVersionInformation(IAsyncResult result)
   at SilverlightApplication1.ServiceReference1.SecurityServiceClient.SilverlightApplication1.ServiceReference1.SecurityService.EndGetVersionInformation(IAsyncResult result)
   at SilverlightApplication1.ServiceReference1.SecurityServiceClient.OnEndGetVersionInformation(IAsyncResult result)
   at System.ServiceModel.ClientBase`1.OnAsyncCallCompleted(IAsyncResult result)}

Я добавил еще одну службу в проект служб, чтобы я мог получитьclientaccesspolicy.xml при запросе корня сервиса и может видеть в fiddler, что этот вызов успешен.

Службы настроены следующим образом:

<behavior name="serviceMetadataBehavior">
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="false" />
      <serviceThrottling maxConcurrentCalls="30" />
      <serviceDebug includeExceptionDetailInFaults="true" />
</behavior>

...

<endpointBehaviors>
    <behavior name="serviceEndpointBehavior">
      <dataContractSerializer maxItemsInObjectGraph="2147483647" />
    </behavior>
    <behavior name="webEndpointBehavior">
      <webHttp/>
    </behavior>
  </endpointBehaviors>

...

  <service behaviorConfiguration="serviceMetadataBehavior" 
           name="PolicyService">
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8082" />
      </baseAddresses>
    </host>
    <endpoint binding="webHttpBinding" 
              name="PolicyEndpoint" 
              bindingName="" 
              contract="IPolicyService" 
              behaviorConfiguration="webEndpointBehavior" />
  </service>

...

<service behaviorConfiguration="serviceMetadataBehavior"  name="SecurityService">
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8082/SecurityService" />
        <add baseAddress="net.tcp://localhost:8083/SecurityService" />
      </baseAddresses>
    </host>
    <endpoint binding="basicHttpBinding" 
              bindingConfiguration="basicHttpBindingConfiguration" 
              name="SecurityServiceEndpoint" 
              bindingName="" 
              contract="ISecurityService" 
              behaviorConfiguration="serviceEndpointBehavior" />
  </service>

, и интерфейсы для этих служб:

[ServiceContract]
public interface IPolicyService
{
    [OperationContract, WebGet(UriTemplate = "/clientaccesspolicy.xml")]
    Stream GetClientAccessPolicy();

    [OperationContract, WebGet(UriTemplate = "/crossdomain.xml")]
    Stream GetCrossDomainAccessPolicy();
}
[Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.WCF.ExceptionShielding("WebService")]
    [ServiceContract(Namespace = Namespaces.Services, Name = "SecurityService")]
    public interface ISecurityService
    {
        [OperationContract]
        [FaultContract(typeof(GeneralServiceFault))]
        Custom.VersionInformation GetVersionInformation(string userName);
    }

со службой политики, возвращающей clientaccesspolicy.xml в видеstream:

<access-policy>
  <cross-domain-access>
    <policy>
      <allow-from>
        <domain uri="*"/>
      </allow-from>
      <grant-to>
        <resource path="/" include-subpaths="true"/>
      </grant-to>
    </policy>
  </cross-domain-access>
</access-policy>

, если мне нужно дать больше информации, пожалуйста, дайте мне знать.Любая помощь высоко ценится.

1 Ответ

0 голосов
/ 14 октября 2010

Сначала вы должны исследовать свою проблему дальше:

Используйте такой инструмент, как fiddler или Firebug, чтобы следить за поведением клиента и проверять, может ли он получить политику.Затем проверьте, может ли он получить правильную политику с соответствующим синтаксисом:

ClientAccessPolicy.xml и crossDomain.xml не используют один и тот же синтаксис, тогда получение одного с другим синтаксисом помешает вашему клиенту понять его.Поэтому вы должны предоставить только один из двух.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...