我的应用程序包含一个包含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?
我跟踪了来自firefox的调用,并且silverlight控件正在向服务地址发送帖子:http://localhost:62535/Services/CustomersTrackerService.svc。看来我的服务只是收听请求。有没有办法允许发布请求...或者在silverlight中配置服务以获取请求?
答案 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