如何从Silverlight调用WCF Web服务?

时间:2008-09-26 16:40:04

标签: wcf silverlight

我正在尝试从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;
    }

有没有人有任何建议我如何解决这个问题?

3 个答案:

答案 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导致所有这些......如果这确实是您遇到的问题。不确定,但也许值得一试