Это, наверное, очень просто, но потерпите меня.
Когда я развертываю свое приложение 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>
Спасибо за чтение
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));
}
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.