从silverlight访问的WCF服务

时间:2011-05-11 06:21:33

标签: silverlight wcf

我的应用程序包含一个包含silverlight控件的MVC3网站。 在MVC3应用程序中,我托管了一个WCF服务。我在silverlight控件中使用该服务从数据库中获取数据。

在MVC web.config中,服务定义为:

<system.serviceModel>
<behaviors>
  <endpointBehaviors>
    <behavior name="OnlineCustomersTracker.Services.CustomersTrackerServiceAspNetAjaxBehavior">
      <enableWebScript />
    </behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior name="">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"
  multipleSiteBindingsEnabled="true" />
<services>
  <service name="OnlineCustomersTracker.Services.CustomersTrackerService">
    <endpoint address="" behaviorConfiguration="OnlineCustomersTracker.Services.CustomersTrackerServiceAspNetAjaxBehavior"
      binding="webHttpBinding" contract="OnlineCustomersTracker.Services.CustomersTrackerService" />
  </service>
</services>

我打电话的方法是:

 [OperationContract]
 [WebGet(ResponseFormat = WebMessageFormat.Xml)]
 public string DoWork()
 {
    // Add your operation implementation here
    return "Work done";
 }

在Silverlight中,我致电该服务:

CustomersTrackerServiceClient client = new CustomersTrackerServiceClient(new BasicHttpBinding(),
                                                                                 new EndpointAddress(
                                                                                     "http://localhost:62535/Services/CustomersTrackerService.svc"));
        client.DoWorkCompleted += new System.EventHandler<DoWorkCompletedEventArgs>(client_DoWorkCompleted);
        client.DoWorkAsync();

当我从silverlight访问该服务时,我得到异常:远程服务器返回错误:NotFound。

奇怪的是,该服务正在通过Web浏览器运行。难道我做错了什么 在silverlight?

application request

我跟踪了来自firefox的调用,并且silverlight控件正在向服务地址发送帖子:http://localhost:62535/Services/CustomersTrackerService.svc。看来我的服务只是收听请求。有没有办法允许发布请求...或者在silverlight中配置服务以获取请求?

3 个答案:

答案 0 :(得分:1)

也许您尚未配置跨域访问策略...

检查一下,这可能是你错过的:

http://www.codeproject.com/KB/silverlight/4StepsSilverLight.aspx

- )

里奇

答案 1 :(得分:1)

这个一般错误并不是很有用。通常,您可以通过启用服务中的日志来获得更多运气,因为这通常会提供更多关于出错的指针,因为在许多情况下会抛出此错误。

要启用日志记录,您可以将其添加到服务的配置文件中:

<configuration>
....
<system.diagnostics>
<trace autoflush="true" />
<sources>
  <source name="System.ServiceModel" switchValue="Verbose">
    <listeners>
      <add name="sdt" type="System.Diagnostics.XmlWriterTraceListener" initializeData="D:\path\to\wcfLog.svcLog" />
    </listeners>
  </source>
</sources>
</system.diagnostics>
</configuration>

您可能遇到的另一个问题是跨域问题,尤其是当您第一次尝试使用Silverlight客户端访问该站点时。您应该在网站的根目录添加crossdomain.xml和clientaccesspolicy.xml。

这些应该包含xml,如下所示:

的crossdomain.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
   <allow-http-request-headers-from domain="*" headers="*" />
 </cross-domain-policy>

ClientAccessPolicy.xml

<?xml version="1.0" encoding="utf-8"?>
<access-policy>
  <cross-domain-access>
    <policy>
      <allow-from http-request-headers="*">
        <domain uri="*"/>
      </allow-from>
      <grant-to>
        <resource include-subpaths="true" path="/"/>
      </grant-to>
    </policy>
  </cross-domain-access>
</access-policy>

Silverlight客户端将尝试访问您站点根目录下的这些文件,因此您应该从那里提供这些文件,如果它是IIS中托管的ASP站点,这应该是直截了当的。 Details on MSDN

如果您的服务是自托管的,则可以提供WCF服务来为它们提供服务,但设置起来会更复杂。 Some details on a self hosted solution

答案 2 :(得分:1)

我终于找到了问题。我没有正确配置端点。 实际上我只有一个端点json one。 我发现了一篇很棒的文章,用于设置具有多个端点的服务。 http://www.codemeit.com/wcf/wcf-restful-pox-json-and-soap-coexist.html