WCF Silverlight通信异常
这篇文章会很长,我为此道歉WCF Silverlight通信异常,silverlight,wcf,communicationexception,Silverlight,Wcf,Communicationexception,这篇文章会很长,我为此道歉 <behaviors> <serviceBehaviors> <behavior name="SimpleServiceBehavior"> <serviceMetadata httpGetEnabled="True"/> </behavior> </serviceBehaviors> </behaviors> 我正在尝试使Silverlight应
<behaviors>
<serviceBehaviors>
<behavior name="SimpleServiceBehavior">
<serviceMetadata httpGetEnabled="True"/>
</behavior>
</serviceBehaviors>
</behaviors>
我正在尝试使Silverlight应用程序与我在visual studio中运行的服务通信,它目前不在IIS中托管。我正试图为这个原型提供尽可能少的代码和配置,只是最低限度。互联网上到处都是关于这个问题的答案,但似乎没有一个适用于我的特殊困境
<behaviors>
<serviceBehaviors>
<behavior name="SimpleServiceBehavior">
<serviceMetadata httpGetEnabled="True"/>
</behavior>
</serviceBehaviors>
</behaviors>
我的服务解决方案有一个SimpleServiceAsyncResult,它实现了IAsyncResult接口、服务接口、ISimpleService以及SimpleService中服务的实际实现。此服务的实现方式如下:
public class SimpleService : ISimpleService
{
public IAsyncResult BeginSimpleMethod(string msg, AsyncCallback callback, object state)
{
return new SimpleServiceAsyncResult<string>(msg);
}
public string EndSimpleMethod(IAsyncResult result)
{
SimpleServiceAsyncResult<string> res = result as SimpleServiceAsyncResult<string>;
return res.Result;
}
public string SimpleMethod(string msg)
{
return msg;
}
public Message ProvideCrossDomainFile()
{
FileStream fileStream = File.Open(@"CrossDomain.xml", FileMode.Open, FileAccess.Read, FileShare.Read);
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Parse;
XmlReader reader = XmlReader.Create(fileStream, settings);
Message result = Message.CreateMessage(MessageVersion.None, "", reader);
return result;
}
public Message ProvidePolicyFile()
{
FileStream fileStream = File.Open(@"ClientAccessPolicy.xml", FileMode.Open, FileAccess.Read, FileShare.Read);
XmlReader reader = XmlReader.Create(fileStream);
Message result = Message.CreateMessage(MessageVersion.None, "", reader);
return result;
}
}
<behaviors>
<serviceBehaviors>
<behavior name="SimpleServiceBehavior">
<serviceMetadata httpGetEnabled="True"/>
</behavior>
</serviceBehaviors>
</behaviors>
关于这个问题,我在网上浏览了几个小时,最终得到了CrossDomain.xml和ClientAccessPolicy.xml以及一些方法,这些方法会公开这个问题,但是无论我怎么尝试,我总是遇到同样的异常。我完全不知道下一步该做什么,我希望你能在这方面进一步帮助我
<behaviors>
<serviceBehaviors>
<behavior name="SimpleServiceBehavior">
<serviceMetadata httpGetEnabled="True"/>
</behavior>
</serviceBehaviors>
</behaviors>
亲切问候在您的服务代码中,
SimpleService
类实现了一个接口(ISimpleService
),我假设它是用[ServiceContract]
修饰的,并定义了五个操作契约(BeginSimpleMethod、EndSimpleMethod、SimpleMethod、ProvideCrossDomainFile、ProvidePolicyFile)。可能ProvidePolicyFile也用[WebGet(UriTemplate=“/clientaccesspolicy.xml”)]修饰
<behaviors>
<serviceBehaviors>
<behavior name="SimpleServiceBehavior">
<serviceMetadata httpGetEnabled="True"/>
</behavior>
</serviceBehaviors>
</behaviors>
现在,因为您只有一个接口,所以您有两件事中的一件:服务器中的端点是SOAP端点(例如,基于basicHttpBinding
),或者端点是REST端点(即webHttpBinding
/webHttp
行为)
<behaviors>
<serviceBehaviors>
<behavior name="SimpleServiceBehavior">
<serviceMetadata httpGetEnabled="True"/>
</behavior>
</serviceBehaviors>
</behaviors>
如果是前者,则返回clientaccesspolicy.xml的操作的位置不正确。根据上的备注部分,这是一种被动行为,只有在端点具有WebHttpBehavior
时才会使用。Silverlight将在一个位置查找该策略文件(http://your_service/clientaccesspolicy.xml)而且在别的地方也能找到(http://your_service/endpoint,其中SOAPAction标头指示方法)
<behaviors>
<serviceBehaviors>
<behavior name="SimpleServiceBehavior">
<serviceMetadata httpGetEnabled="True"/>
</behavior>
</serviceBehaviors>
</behaviors>
如果是后者,那么Silverlight在默认情况下无法调用这些端点(请参阅文章中的调用和SL中的端点),因此它也不会工作
<behaviors>
<serviceBehaviors>
<behavior name="SimpleServiceBehavior">
<serviceMetadata httpGetEnabled="True"/>
</behavior>
</serviceBehaviors>
</behaviors>
这篇文章是一种“规范”的方式,使SL能够在自托管WCF服务上调用服务。您将需要两个端点(可能在两个接口中),一个用于服务本身,一个用于策略文件。这篇文章提供了有关此问题的更多详细信息。另外:如果您有crossdomainpolicy.xml文件,则不需要CrossDomain.xml文件。CrossDomain.xml用于闪存兼容性,没有相同的功能范围。。。删除它。我直接从VisualStudio中的解决方案运行它,因此CrossDomain.xml和ClientAccesspolicy.xml位于/bin/Debug中。但正如我在文章中所说,使用其中一个、另一个或两者,对于我所面临的问题并不重要。它可能与从VisualStudio运行有关。。。
<behaviors>
<serviceBehaviors>
<behavior name="SimpleServiceBehavior">
<serviceMetadata httpGetEnabled="True"/>
</behavior>
</serviceBehaviors>
</behaviors>