如何从Silverlight调用WCF Web服务?

时间:2020-03-06 14:47:39  来源:igfitidea点击:

我试图从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服务以外的其他域中,则可能需要看一下这篇文章,以拥有一个跨域定义文件,或者写一个中间的"代理"。