11

我有一个 WCF 服务和一个 Silverlight 5 客户端。我定义了以下接口:

[ServiceContract(Namespace = "Silverlight", CallbackContract = typeof(IDuplexClient))]
public interface IDuplexService
{
    [OperationContract]
    void Subscribe(string userId);

    [OperationContract]
    void Unsubscribe(string userId);
}

[ServiceContract]
public interface IDuplexClient
{
    [OperationContract(IsOneWay = true)]
    void PushNotification(string msg);
}

这是我的 Web.config 文件:

<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
</configuration>

当我尝试运行该服务时,我得到:

由于编译期间出现异常,无法激活服务“/ServerService.svc”。异常消息是:Contract 需要 Duplex,但 Binding 'BasicHttpBinding' 不支持它或未正确配置以支持它。

我知道我需要向 Web.config 添加一些属性,但是无论我在哪里(以及无论我尝试过什么),我都无法让它工作。

我是 WCF 的新手,我希望您能在该主题上提供帮助。我所有的谷歌搜索都让我无处可去,在这里问同样问题的人得到的答案对我不起作用。

所以我决定放弃搜索,只是问问。

更新:我使用此链接创建界面 - http://msdn.microsoft.com/en-us/library/cc645027%28v=vs.95%29.aspx

4

1 回答 1

19

如果这是 WCF 的 web.config 配置的范围,那么您缺少定义您的合同的部分:

<services>
  <service name="WebApplication1.Service1">
    <endpoint address="" binding="wsDualHttpBinding" contract="WebApplication1.IService1" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>
</services>

如果您确实指定了此部分,则另一个可能的原因是合同名称不完全限定;它必须包括完整的命名空间,而不仅仅是合同的名称。

这是完整的 System.ServiceModel 配置:

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    <services>
      <service name="WebApplication1.Service1">
        <endpoint address="" binding="wsHttpBinding" contract="WebApplication1.IService1" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
  </system.serviceModel>

在这种情况下,应用程序命名空间是WebApplication1,服务的类名是Service1(即Service1.svc),Service1实现的接口是IService1。

于 2013-01-08T23:51:10.240 回答