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>