1

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

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

4

3 回答 3

1

如果 Silverlight 应用程序未托管在公开您要调用的 Web 服务的同一域中,则适用跨域限制。

如果您希望 Silverlight 应用程序托管在 Web 服务之外的另一个域中,您可能希望查看这篇文章以帮助您拥有一个跨域定义文件,或者改为编写一个中间“代理”。

于 2008-10-09T08:57:25.557 回答
0

你不会碰巧从文件系统运行吧?如果您在本地计算机上提供 silverlight 应用程序,而不使用 VS Web 服务器或 IIS,则出于安全原因,您将无法进行 HTTP 调用。同样,如果您从 Web 服务器加载,则无法访问本地资源。

此外,我发现 Nikhil 的 Web 开发助手http://www.nikhilk.net/ASPNETDevHelperTool.aspx可能比 Fiddler 更有用,因为您也会看到本地流量,尽管看起来这不是您的问题这个案例。

于 2008-09-26T16:48:22.413 回答
0

我不能 100% 确定,但如果您在 Vista 或 Server 2008 上运行,您可能会遇到 http.sys 的用户访问控制问题

因此在 Vista 和 Win2k8 服务器中,HttpListener 仅在您运行在高权限帐户下时才会侦听。事实上,根据我的经验,即使您将自己添加到本地管理员组,您也可能会遇到这个问题。

在任何情况下,尝试通过右键单击并以管理员身份在 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 会导致这一切……如果这确实是您遇到的问题。不确定,但也许值得一试

于 2008-09-26T20:13:29.970 回答