Я пытаюсь вызвать веб-сервис WCF (который я разработал) из приложения Silverlight. По какой-то причине приложение Silverlight не выполняет HTTP-вызов службы с помощью мыла. Я знаю это, потому что я обнюхиваю весь http-трафик с помощью Fiddler (и это не вызов localhost).
Это моя конфигурация на сервере, относящаяся к WCF:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name = "ServiceBehavior">
<serviceMetadata httpGetEnabled = "true"/>
<serviceDebug includeExceptionDetailInFaults = "false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled = "true"/>
<services>
<service behaviorConfiguration = "ServiceBehavior" name = "Service">
<endpoint address = "" binding = "basicHttpBinding" contract = "Service"/>
<endpoint address = "mex" binding = "mexHttpBinding" contract = "IMetadataExchange"/>
</service>
</services>
</system.serviceModel>
И файл ServiceReferences.ClientConfig в приложении silverlight (я использую бета-версию 2):
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name = "BasicHttpBinding_Service" maxBufferSize = "65536"
maxReceivedMessageSize = "65536">
<security mode = "None" />
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address = "http://itlabws2003/Service.svc" binding = "basicHttpBinding"
bindingConfiguration = "BasicHttpBinding_Service" contract = "Silverlight_organigram.DataService.Service"
name = "BasicHttpBinding_Service" />
</client>
</system.serviceModel>
Это метод silverlight, который вызывает службу, я вставляю весь метод для полноты, лямбда должна сделать вызов синхронным, я отладил его, и после строки client.GetPersonsAsync () Fiddler не показывает никаких сообщений, отправляемых в сервер.
public static List<Person> GetPersonsFromDatabase()
{
List<Person> persons = new List<Person>();
ServiceClient client = new ServiceClient();
ManualResetEvent eventGetPersons = new ManualResetEvent(false);
client.GetPersonsCompleted += new EventHandler<GetPersonsCompletedEventArgs>(delegate(object sender, GetPersonsCompletedEventArgs e)
{
foreach (DTOperson dtoPerson in e.Result)
{
persons.Add(loadFromDto(dtoPerson));
}
eventGetPersons.Set();
});
client.GetPersonsAsync();
eventGetPersons.WaitOne();
return persons;
}
Есть ли у кого-нибудь предложения, как я могу это исправить?





Вы бы случайно не запускались из файловой системы, не так ли? Если вы обслуживаете приложение Silverlight на своем локальном компьютере и не используете VS Web Server или IIS, вы не сможете выполнять HTTP-вызовы по соображениям безопасности. Точно так же, если вы загружаете с веб-сервера, вы не можете получить доступ к локальным ресурсам.
Также я обнаружил, что Nikhil's Web Development Helper http://www.nikhilk.net/ASPNETDevHelperTool.aspx может быть более полезным, чем Fiddler, потому что вы также увидите локальный трафик, хотя в данном случае не похоже, что это ваша проблема.
Я не уверен на 100%, но если вы работаете в Vista или Server 2008, возможно, вы столкнулись с проблемой контроля доступа пользователей с http.sys.
Таким образом, на сервере Vista и Win2k8 HttpListener будет прослушивать, только если вы работаете под учетной записью с высоким уровнем привилегий. Фактически, по моему опыту, даже если вы добавитесь в группу администраторов местный, вы можете столкнуться с этой проблемой.
В любом случае попробуйте запустить Visual Studio в Vista, щелкнув правой кнопкой мыши и запустите от имени администратора. Посмотрим, исправит ли это это. Если да, то все в порядке, но ....
в идеале вы должны запустить httpcfg
нравиться: httpcfg установить urlacl -u http: // itlabws2003 -a D: (A ;; GX ;;; твойсид)
ваш sid = идентификатор безопасности учетной записи, под которой вы работаете, вы можете найти его здесь: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ ProfileList
если вы этого еще не знаете или можете добавить себя в BUILTIN \ Administators, найдите sid и снова запустите httpcfg через командную строку, указав этот sid.
Контроль доступа пользователей, Vista и Http.sys вызывают все это ... если это действительно проблема, с которой вы столкнулись. Не уверен, но, возможно, стоит попробовать
кроме того, это необходимо сделать на обоих коробках, если это действительно так.
спасибо за ответ, я использую Windows Server 2003 и XP pro, так что я думаю, что это не мой случай, но я буду иметь это в виду.
Если приложение Silverlight не размещено в том же домене, который предоставляет веб-службу, которую вы хотите вызвать, применяются междоменные ограничения.
Если вы хотите, чтобы приложение Silverlight размещалось в другом домене, чем веб-служба, вы можете взглянуть на эта почта, чтобы помочь вам иметь файл определения междоменного домена или вместо этого написать средний «прокси».
Веб-сайт работает в IIS 6.1 на другом компьютере в локальной сети.