Это, наверное, очень просто, но потерпите меня.

Когда я развертываю свое приложение Silverlight 5 с WCF в IIS, используя простую технику копирования и вставки, я могу безупречно просматривать веб-сайт, но когда я пытаюсь получить к нему доступ через ipaddress, например 192.168.1.3:8099 каждый вызов службы возвращает ошибку, такую ​​как эта:

An exception occurred during the operation, making the result invalid.  Check InnerException for exception details.
  at .....
  at <MyNamespace>.OnGetSomethingFromDataBaseCompleted(Object state)

Я могу успешно настроить таргетинг на службы WCF с других машин (192.168.1.3:8099/SomeService.svc). Я написал тестовое консольное приложение для вызова (и закрытия) службы, и оно правильно получает некоторые данные с удаленного DBServer. Пока в браузере ничего.

A должен добавить это обратно из браузера при переходе к 192.168.1.3:8099 Fiddler не регистрирует этот вызов, но он регистрирует его с localhost: 8099.

Вы можете помочь?

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


Итак, вы читаете => (Призма).

У меня есть приложение Silverlight, которое подключается к базе данных, вызывающей службы WCF (добавлено как служба Silverlight WCF - VSTemplate).

В этом приложении я представляю Prism, как предлагает Джереми Ликнесс в своем blog

Я также использую веб-прокси для доступа к службам WCF из ViewModel.

Моя структура проекта:

  • WEB проект
  • SilverlightAppWithShell
  • ModuleA
  • ModuleB
  • CommonProject

Структура каталогов развертывания:

C: \ inetpub \ wwwroot \ MyAppFolder (у IISUsers есть accessToIt)

  • . \ bin \ AllDlls
  • . \ ClientBin \ AllXapFiles (файлы XAP из всех проектов, упомянутых выше)
  • . \ Services \ Все файлы * .cs, определяющие контракты на работу сервисов
  • . \ Web.config
  • . \ TestPage.html
  • . \ TestPage.aspx
  • . \ Silverlight.js
  • . \ AllServices * .scv файлы

И последний по порядку но не по значимости

  • . \ clientaccesspolicy.xml

С этим кодом внутри:

<?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="/Services" include-subpaths="true"/><!--I tried with App_Code here when renaming Services dir to App_Code with the same wain result-->
      </grant-to>
    </policy>
  </cross-domain-access>
</access-policy>

Спасибо за чтение

0
nzic 24 Янв 2013 в 22:04
В настоящее время я проверяю this Я дам вам знать, если это поможет.
 – 
nzic
25 Янв 2013 в 16:20

1 ответ

Лучший ответ

Это то, что я в итоге сделал и решил свою проблему, следуя это сообщение Карлоса Фигейры. Я не уверен, есть ли лучшее решение с Silverlight 5, но оно работает для меня.

public static void UpdateMyServiceAddress(WebServiceMyProxies.MyServiceClient client)
        {
            client.Endpoint.Address = UpdateServiceAddress(client.Endpoint.Address.Uri.ToString());
        }

private static System.ServiceModel.EndpointAddress UpdateServiceAddress(string originalAddress)
        {
            int svcIndex = originalAddress.IndexOf(".svc");
            int serviceNameIndex = originalAddress.LastIndexOf('/', svcIndex);
            string serviceName = originalAddress.Substring(serviceNameIndex + 1);

            string baseAddress = Application.Current.Host.Source.ToString();
            baseAddress = baseAddress.Substring(0, baseAddress.LastIndexOf('/')); // removing /App.xap
            baseAddress = baseAddress.Substring(0, baseAddress.LastIndexOf('/')); // removing /ClientBin

            return new System.ServiceModel.EndpointAddress(String.Format("{0}/{1}/{2}", baseAddress,"Services", serviceName));
        }
0
nzic 26 Янв 2013 в 05:20