跨域WCF-Silverlight配置错误a:ActionNotSupported
我尝试从SilverLight代码运行WCF函数。WCF正在网站www.my-site.com上运行 Silverlight应用程序从网站www.my-site.com下载,作为从网站www.vkontakte.ru下载的html页面的部分。我收到一个a:ActionNotSupported错误。跨域WCF-Silverlight配置错误a:ActionNotSupported,silverlight,wcf,web-config,cross-domain,wcf-configuration,Silverlight,Wcf,Web Config,Cross Domain,Wcf Configuration,我尝试从SilverLight代码运行WCF函数。WCF正在网站www.my-site.com上运行 Silverlight应用程序从网站www.my-site.com下载,作为从网站www.vkontakte.ru下载的html页面的部分。我收到一个a:ActionNotSupported错误。 怎么了 以下是我的silverlight应用程序发送的请求: 发布HTTP/1.1 接受:/ 推荐人: 接受语言:ru-ru 内容长度:153 内容类型:text/xml;字符集=utf-8 SOAP
怎么了 以下是我的silverlight应用程序发送的请求: 发布HTTP/1.1
接受:/
推荐人:
接受语言:ru-ru
内容长度:153
内容类型:text/xml;字符集=utf-8
SOAPAction:“http://tempuri.org/IMyService/Add“
接受编码:gzip,放气
用户代理:Mozilla/5.0(兼容;MSIE 9.0;Windows NT 6.1;Trident/5.0)
主持人:www.my-site.com
连接:保持活动状态
Pragma:没有缓存
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<Add xmlns="http://tempuri.org/">
<a1>1</a1>
<a2>1</a2>
</Add>
</s:Body>
</s:Envelope>
WCF运营合同界面:
[ServiceContract]
public interface IMyService
{
[OperationContract(AsyncPattern = true)]
IAsyncResult BeginAdd(long a1, long a2, AsyncCallback callback, object state);
long EndAdd(IAsyncResult result);
}
[ServiceContract]
public interface IMyService
{
[OperationContract]
long Add(long a1, long a2);
}
WCF服务代码:
[AspNetCompatibilityRequirements(
RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class MyService: IMyService
{
public long Add(long a1, long a2)
{
return a1 + a2;
}
}
web.config的一部分:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="MySlApp.Web.ServiceMyServiceAspNetAjaxBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="MySlApp.Web.MyServiceAspNetAjaxBehavior">
<enableWebScript />
</behavior>
</endpointBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"
multipleSiteBindingsEnabled="true" />
<services>
<service name="MySlApp.Web.DbService"
behaviorConfiguration="MySlApp.Web.ServiceMyServiceAspNetAjaxBehavior">
<endpoint address=""
binding="webHttpBinding" contract="MySlApp.Web.IMyService" />
</service>
</services>
</system.serviceModel>
clientaccesspolicy.xml:
<?xml version="1.0" encoding="utf-8" ?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="*">
<domain uri="http://www.my-site.com" />
<domain uri="http://www.vkontakte.ru" />
<domain uri="http://*.vkontakte.ru" />
<domain uri="http://www.vk.com" />
<domain uri="http://*.vk.com" />
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
crossdomain.xml:
<?xml version="1.0" encoding="utf-8" ?>
<cross-domain-policy>
<allow-access-from domain="www.my-site.com" />
<allow-access-from domain="www.vkontakte.ru" />
<allow-access-from domain="*.vkontakte.ru" />
<allow-access-from domain="www.vk.com" />
<allow-access-from domain="*.vk.com" />
</cross-domain-policy>
这不是跨域问题。问题是您发送的请求符合
basicHttpBinding
,而服务器端点使用webHttpBinding
。如果您将web.config更改为下面列出的,它应该可以工作
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="MySlApp.Web.ServiceMyServiceAspNetAjaxBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"
multipleSiteBindingsEnabled="true" />
<services>
<service name="MySlApp.Web.DbService"
behaviorConfiguration="MySlApp.Web.ServiceMyServiceAspNetAjaxBehavior">
<endpoint address=""
binding="basicHttpBinding" contract="MySlApp.Web.IMyService" />
</service>
</services>
</system.serviceModel>
如果无法更改服务,则需要更改客户端
webHttpBinding
端点也称为WCF WebHttp端点,或(不知何故过度使用了“REST”术语)WCF REST端点,无法使用WCF编程模型(客户端类,ChannelFactory
等)通过SL直接访问。这是可以做到的(参见关于的帖子和关于的帖子),但这不是一件容易的事情(大多数人使用诸如WebClient
或HttpWebRequest
之类的简单类来使用这些服务。这不是跨域问题。问题是,如果更改web.conf,您发送的请求符合basicHttpBinding
,而服务器端点使用webHttpBinding
对于下面列出的一个,它应该可以工作
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="MySlApp.Web.ServiceMyServiceAspNetAjaxBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"
multipleSiteBindingsEnabled="true" />
<services>
<service name="MySlApp.Web.DbService"
behaviorConfiguration="MySlApp.Web.ServiceMyServiceAspNetAjaxBehavior">
<endpoint address=""
binding="basicHttpBinding" contract="MySlApp.Web.IMyService" />
</service>
</services>
</system.serviceModel>
如果无法更改服务,则需要更改客户端。
webHttpBinding
端点也称为WCF WebHttp端点,或(不知何故过度使用了“REST”术语)WCF REST端点,无法使用WCF编程模型(客户端类,ChannelFactory
等)通过SL直接访问。可以这样做(参见关于的帖子和关于的帖子),但这并不容易(大多数人使用诸如WebClient
或HttpWebRequest
之类的简单类来使用这些服务。您是将其创建为Silverlight兼容的WCF服务还是普通的旧WCF服务?您是将其创建为Silverlight兼容的WCF服务还是普通的旧WCF服务?
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="MySlApp.Web.ServiceMyServiceAspNetAjaxBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"
multipleSiteBindingsEnabled="true" />
<services>
<service name="MySlApp.Web.DbService"
behaviorConfiguration="MySlApp.Web.ServiceMyServiceAspNetAjaxBehavior">
<endpoint address=""
binding="basicHttpBinding" contract="MySlApp.Web.IMyService" />
</service>
</services>
</system.serviceModel>