如何从Silverlight调用WCF Web服务?
我试图从Silverlight应用程序调用WCF Web服务(由我开发)。由于某些原因,Silverlight应用程序不会对服务进行http soap调用。我知道这是因为我正在用Fiddler嗅探所有的HTTP流量(这不是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>
以及silverlight应用程序中的ServiceReferences.ClientConfig文件(我正在使用beta 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方法,我粘贴了整个方法以确保完整性,lambda是使调用同步,已经调试了该调试器,并在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服务器或者IIS,则出于安全原因,我们将无法进行HTTP调用。同样,如果从Web服务器加载,则无法访问本地资源。
另外我还发现,Nikhil的Web开发帮助器http://www.nikhilk.net/ASPNETDevHelperTool.aspx比Fiddler更为有用,因为我们也会看到本地流量,尽管看起来这不是问题这个案例。
我不确定100%,但是如果我们在Vista或者Server 2008上运行,则可能会遇到http.sys的用户访问控制问题
因此,在Vista和Win2k8服务器中,仅当我们以较高的特权帐户运行时,HttpListener才会侦听。实际上,根据我的经验,即使我们将自己添加到本地管理员组,也可能会遇到此问题。
无论如何,请尝试通过右键单击并以管理员身份运行Windows Vista上的Visual Studio。看看是否能解决问题。如果是的话,那你很好,但是....
理想情况下,我们应该运行httpcfg
喜欢:
httpcfg设置urlacl -u http:// itlabws2003 -a D:(A ;; GX ;;; yoursid)
sid =我们以其身份运行的帐户的安全标识符,我们可以在这里找到它:
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ ProfileList
如果我们还不知道它,或者我们可以将自己添加到BUILTIN \ Administators中,请找到该sid并通过命令行再次运行httpcfg,并指定该sid。
用户访问控制,Vista和Http.sys会导致所有这一切……如果这确实是我们遇到的问题。不确定,但也许值得一试
如果Silverlight应用程序未托管在公开要调用的Web服务的同一个域中,那么将应用跨域限制。
如果我们希望将Silverlight应用程序托管在Web服务以外的其他域中,则可能需要看一下这篇文章,以拥有一个跨域定义文件,或者写一个中间的"代理"。