WCF:客户端配置中的合同"X"与服务合同中的名称不匹配

FBr*_*t87 1 c# wcf

当我尝试在VS中运行我的WCF服务时,会显示此错误消息,并且我正在尝试通过"客户端配置"和"服务合同"来确定它实际指的是什么:

客户端配置中的合同"IMyService"与服务合同中的名称不匹配

我假设服务合同部分指的是:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(Namespace = "http://xxx/yyy", ConfigurationName = "IMyService")]
public interface IMyService
{
    // CODEGEN: Generating message contract since the operation MyService is neither RPC nor document wrapped.
    [System.ServiceModel.OperationContractAttribute(Action = "", ReplyAction = "*")]
    [System.ServiceModel.XmlSerializerFormatAttribute()]
    [System.ServiceModel.ServiceKnownTypeAttribute(typeof(Task))]
    SendResponse Request(SendRequest request);
}
Run Code Online (Sandbox Code Playgroud)

任何想法客户端配置指的是什么?

编辑:在我的web.config中我有system.serviceModel的这一部分:

 <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="MyServiceBinding">
          <security mode="None" />
        </binding>
      </basicHttpBinding>
    </bindings>
    <services>
      <service name="XXX.YYY.MyService">
        <endpoint binding="basicHttpBinding" bindingConfiguration="MyServiceBinding" name="MyServiceSendHttps"
          contract="IMyService" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost" />
          </baseAddresses>
        </host>
      </service>
    </services>
Run Code Online (Sandbox Code Playgroud)

小智 9

我遇到了同样的问题,我花了很多时间寻找解决方案.然后我发现这篇文章是关于WCF工具svcutil.exe生成的代码.

生成的C#代码不保证也适用于服务端合同.在我的情况下,问题是在ReplyAction ="*"(我也在问题中看到).根据MSDN文档:

在服务中指定星号指示WCF不向消息添加回复操作,如果您直接对消息进行编程,这将非常有用.

改变之后

[System.ServiceModel.OperationContractAttribute(Action = "", ReplyAction = "*")]
Run Code Online (Sandbox Code Playgroud)

[System.ServiceModel.OperationContractAttribute(Action = "")]
Run Code Online (Sandbox Code Playgroud)

问题解决了.


Ale*_*lev 5

请参阅项目中的 app.config 文件。如果不以编程方式配置客户端,则 app.config 文件必须包含客户端配置节点。

更新:您的第一个代码片段包括这一行:

[System.ServiceModel.ServiceContractAttribute(Namespace = "http://xxx/yyy", ConfigurationName = "IMyService")]`.
Run Code Online (Sandbox Code Playgroud)

在“ConfigurationName”属性的文档中:https : //msdn.microsoft.com/en-us/library/system.servicemodel.servicecontractattribute.configurationname%28v=vs.110%29.aspx 我们可以阅读:

用于在应用程序配置文件中定位服务元素的名称。默认是服务实现类名称。

所以,我们有:服务实现类的名称是“XXX.YYY.MyService”,并且(在第二个代码片段中)我们看到“<service name="XXX.YYY.MyService">”但属性的 ConfigurationName 值是“IMyService ”。

如果您只是从行中删除 'ConfigurationName = "IMyService" '

[System.ServiceModel.ServiceContractAttribute(Namespace = "http://xxx/yyy", ConfigurationName = "IMyService")]
Run Code Online (Sandbox Code Playgroud)

像这样:

[System.ServiceModel.ServiceContractAttribute(Namespace = "http://xxx/yyy")]
Run Code Online (Sandbox Code Playgroud)

这应该可以解决问题。