我正在尝试从Silverlight应用程序调用WCF Web服务(我开发)。由于某种原因,Silverlight应用程序不会对服务进行http soap调用。我知道这是因为我用Fiddler嗅探所有的http流量(并且它不是本地主机调用)。
这是我在服务器中与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方法,我将整个方法粘贴为copleteness,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;
}
有没有人有任何建议我如何解决这个问题?
答案 0 :(得分:1)
如果Silverlight应用程序未托管在您要调用的Web服务的同一域中,则适用跨域限制。
如果您希望将Silverlight应用程序托管在除Web服务之外的其他域中,您可能需要查看this post以帮助您拥有跨域定义文件,或者编写中间文件“代理“而不是。
答案 1 :(得分:0)
你不会碰巧从文件系统运行吗?如果您正在为本地计算机提供silverlight应用程序而不使用VS Web服务器或IIS,则出于安全原因,您将无法进行HTTP调用。同样,如果您从Web服务器加载,则无法访问本地资源。
此外,我发现Nikhil的Web开发帮助http://www.nikhilk.net/ASPNETDevHelperTool.aspx比Fiddler更有用,因为您也会看到本地流量,尽管在这种情况下看起来不是您的问题。
答案 2 :(得分:0)
我不是100%肯定,但如果您在Vista或Server 2008上运行,则可能遇到了http.sys的用户访问控制问题
因此,在Vista和Win2k8服务器中,只有在高级别帐户下运行时,HttpListener才会收听。事实上,根据我的经验,即使您将自己添加到本地管理员组,也可能会遇到此问题。
在任何情况下,尝试通过Right Clicking和runas Administrator在Vista上启动Visual Studio。看看是否能修复它。如果是的话,你很好,但是......
理想情况下,您应该运行httpcfg
像: httpcfg set 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导致所有这些......如果这确实是您遇到的问题。不确定,但也许值得一试