Silverlight - WCF получает доступ к политике на локальном хосте - PullRequest
0 голосов
/ 07 февраля 2011

У меня есть приложение Silverlight, которое использует WCF для связи с сервером.И Silverlight, и WCF работают на локальном компьютере (localhost).Когда Silverlight выполняет вызов службы, происходит сбой с исключением связи.Я понимаю, что это потому, что у меня нет файла cliententaccesspolicy, но поскольку конечная точка WCF работает на http://localhost:port, я определил интерфейс IPolicyRetriver и добавил реализацию в службу, которая возвращает клиентскую политику доступа вstream.

Мой вопрос: что мне нужно настроить, чтобы он работал без проблем?Я понимаю, что мне нужно что-то изменить или добавить в мой файл ServiceReference.ClientConfig, но я не понимаю, что именно.Я включил свой ServiceReference.ClientConfig ниже.Пожалуйста, дайте мне знать, что изменить или добавить к нему, и где в Silverlight добавить этот код.Пожалуйста, не вставляйте сюда никакие ссылки, чтобы помочь мне, поскольку я открывал каждую ссылку, которую мог, в течение последних двух дней - но все еще не понимаю.

Ответы [ 2 ]

1 голос
/ 15 февраля 2011

Вы не включили упомянутую реализацию IPolicyRetriever, но вот пример, который вы можете использовать.

Спецификация интерфейса:

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

    //[OperationContract, WebGet(UriTemplate = "/crossdomain.xml")]
    //Stream GetFlashPolicy();
}

Реализация интерфейса:

    // IPolicyRetriever implementation
    private Stream StringToStream(string result)
    {
        WebOperationContext.Current.OutgoingResponse.ContentType = "application/xml";
        return new MemoryStream(Encoding.UTF8.GetBytes(result));
    }

    public Stream GetSilverlightPolicy()
    {
        string result = @"<?xml version=""1.0"" encoding=""utf-8""?>
          <access-policy>
            <cross-domain-access>
              <policy>
                <allow-from http-request-headers=""*"">
                  <domain uri=""*""/>
                </allow-from>
                <grant-to>
                  <resource path=""/"" include-subpaths=""true""/>
                </grant-to>
              </policy>
            </cross-domain-access>
          </access-policy>";

        return StringToStream(result);
     }

Затем вы можете включить следующее в XML-файл конфигурации вашего сервера.Это должно быть на стороне сервера, а не на стороне клиента.Я подчеркиваю это, потому что вы включили конфигурацию клиента выше в свой вопрос.

<behaviors>
  <endpointBehaviors>
    <behavior name="WebHttpNewBehavior">
      <webHttp />
    </behavior>
  </endpointBehaviors>
  ...
</behaviors>
<services>
  <service behaviorConfiguration="NewBehavior">
    <endpoint behaviorConfiguration="WebHttpNewBehavior" binding="webHttpBinding"
                bindingConfiguration="" name="PolicyEndpoint" contract="WCFService.IPolicyRetriever" />
    ...
  </service>
</services>

В качестве альтернативы, если вы решили создать свой хост программно (именно так я делаю, а не использовать файл ClientConfig, поэтомуприведенный выше пример может быть неправильным на 100%):

ServiceHost host = new ServiceHost(serviceType);
host.AddServiceEndpoint(typeof(IPolicyRetriever), new WebHttpBinding(), "").Behaviors.Add(new WebHttpBehavior());

Я знаю, что вы просили не предоставлять ссылки, но я использовал http://blogs.msdn.com/b/asiatech/archive/2010/05/07/how-to-consume-a-self-hosted-wcf-service-in-a-cross-domain-environment-by-silverlight-client.aspx в качестве справки, чтобы обновить память, потому что я неу меня есть доступ к моему проекту Silverlight / WCF прямо сейчас.

0 голосов
/ 07 февраля 2011

Вам не нужно ничего менять в конфигурации службы или коде. Поместите clientaccesspolicy.xml в корень веб-сайта службы. Если вы используете Visual Studio, вам может потребоваться изменить свойство, чтобы оно заработало. Silverlight будет искать наличие файла. Я мог бы помочь вам использовать такой инструмент, как Fiddler, чтобы узнать, где Silverlight ищет файл.

Есть одна ссылка, которая мне показалась очень полезной, но так как вам не нужны никакие ссылки, я не буду ее предоставлять.

...