В чем разница между процессом использования WCF в приложении Windows и в Silverlight? - PullRequest
1 голос
/ 15 ноября 2010

У меня есть функция WCF, «строка GetDetails (int x, int y)», и она теперь развернута на сервере в приложении Windows.Я могу вызвать его функцию, написав

ServiceReference1.ServiceClient objService = new ServiceReference1.ServiceClient ();string data = objService.GetData (10,23);

Но в Silverlight я не могу этого сделать.Почему?

Ответы [ 2 ]

1 голос
/ 15 ноября 2010

Возможно, вы также захотите прочитать файл ClientAccessPolicy.xml. Вот хорошая ссылка здесь, на SO. В двух словах, ваша служба должна позволять вызываться, предоставляя клиенту Silverlight доступ к своему домену через файл ClientAccessPolicy.xml. Это часто делается путем создания службы (которая может быть реализована в том же проекте, в котором размещается ваша служба), которая обеспечивает доступность файла ClientAccessPolicy.xml в правильном месте.

Если ваша служба размещена самостоятельно, вы можете добавить код, подобный этому, при запуске службы (Основной):

        // This service is used to retrieve the client access policy to allow for cross-domain service calls.
        ServiceHost ClientAccessPolicyService = null;
        ClientAccessPolicyService = new ServiceHost(typeof(ClientAccessPolicyService));
        ClientAccessPolicyService.Open();

Строки, подобные этой (из нашего проекта, который в настоящее время находится в разработке, я уверен, что эти параметры будут улучшены к моменту развертывания), добавляются в файл app.config вашей службы:

  <service name="ClientAccessPolicyService">
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8731/"/>
      </baseAddresses>
    </host>
    <endpoint address=""
              binding="webHttpBinding"
              contract="IClientAccessPolicy"
              behaviorConfiguration="HttpEnableBehavior">
    </endpoint>
  </service>

  <endpointBehaviors>
    <behavior name="HttpEnableBehavior">
      <webHttp/>
    </behavior>
  </endpointBehaviors>

Где ClientAccessPolicyService - это ваша служба, предоставляющая файл ClientAccessPolicy.xml, а IClientAccessPolicy - это OperationContract.

Надеемся, что между этой информацией и информацией по ссылке выше (и ее встроенными ссылками) вы сможете получить доступ к своему сервису из Silverlight. Может быть, я больше и не учусь, но я на самом деле только начинаю с WCF и Silverlight, поэтому мне повезло, что что-то работает!

Удачи!

1 голос
/ 15 ноября 2010

Поскольку SL допускает только асинхронные вызовы от сервисного клиента (это не обязательно означает, что ваши операции асинхронны на сервере).

Вам придется сделать что-то вроде:

ServiceReference1.ServiceClient objService = new ServiceReference1.ServiceClient(); 
objService.GetDataCompleted += OnGetDataCompleted;
objService.GetData(10,23);

private void OnGetDataCompleted(object sender, GetDataCompletedEventArgs e)
{
  if (e.Error == null)
  {
    string data = e.Result;
    // Do something with data
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...