Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wcf 从具有两个协定和端点的服务创建代理_Wcf - Fatal编程技术网

Wcf 从具有两个协定和端点的服务创建代理

Wcf 从具有两个协定和端点的服务创建代理,wcf,Wcf,我在向app.config添加实现两个契约的服务时遇到问题,因此需要两个端点 请参阅此问题,了解我正在尝试做的基本示例: 我确实希望在我的客户端中使用服务引用来为我创建和维护代理,但当我尝试对具有两个端点的服务执行此操作时,当它尝试下载元数据时,在详细信息中会出现以下错误: 元数据包含无法解析的引用 以下是我如何在wcf服务库的app.config中设置服务的示例: <service name="MyService"> <endpoint address="Addr

我在向app.config添加实现两个契约的服务时遇到问题,因此需要两个端点

请参阅此问题,了解我正在尝试做的基本示例:

我确实希望在我的客户端中使用服务引用来为我创建和维护代理,但当我尝试对具有两个端点的服务执行此操作时,当它尝试下载元数据时,在详细信息中会出现以下错误:

元数据包含无法解析的引用

以下是我如何在wcf服务库的app.config中设置服务的示例:

  <service name="MyService">
    <endpoint address="Address1" binding="wsDualHttpBinding" bindingConfiguration=""
      name="Service1" contract="IService1" />
    <endpoint address="Address2" binding="wsDualHttpBinding" bindingConfiguration=""
      name="Service2" contract="IService2" />
    <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration=""
      name="mex" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8732/Design_Time_Addresses/MyService/" />
      </baseAddresses>
    </host>
  </service>
我觉得我错过了一些简单的事情。当我删除其中一个端点时,一切正常。但是如果我有两个端点,它就无法解析元数据

我尝试删除基址并使用完整地址,使用不同的端口,但我尝试的所有路径都会导致相同的错误

编辑: 我想首先应该澄清我为什么要这么做。我有一个单身服务,我希望客户能够连接到。但是有一些方法我不希望客户端能够访问。我认为将admin方法和client方法分离成两个单独的契约将是一个好的开始

更清楚的是,这是一个游戏服务器。我希望能够启动游戏服务器的新实例,并向其发送地图之类的东西。 我不想让玩家使用LoadMap之类的方法。 我真的想把游戏客户端的方法和回调与配对服务或服务器管理员的方法和回调分开

我还希望它们是单独的合同,以便更容易阅读和维护


不过,如果有更好的方法,我愿意听取建议。

我花了一段时间才弄明白这一点。我拆毁了我的项目,从一开始就开始重建,直到它崩溃

显然,如果您尝试这样做,那么您的回调契约中就不能有两个同名的回调方法

例如:

public interface IService1Callback
{
    [OperationContract(IsOneWay = true)]
    void GetDataDone();
}

public interface IService2Callback
{
    [OperationContract(IsOneWay = true)]
    void GetDataDone();
}
如果随后将这些设置为服务合同上的回调合同,如下所示:

[ServiceContract
(Namespace = "ServiceLib", 
SessionMode = SessionMode.Required, CallbackContract = typeof(IService1Callback))]
public interface IService1
{
    [OperationContract(IsInitiating = true)]
    string GetData(int value);
}

[ServiceContract
(Namespace = "ServiceLib", 
SessionMode = SessionMode.Required, CallbackContract = typeof(IService2Callback))]
public interface IService2
{
    [OperationContract(IsInitiating = true)]
    string GetOtherData(int value);
}
你最终会得到我在原始问题中提到的错误

我认为这是因为端点无法确定方法来自哪个回调契约,因为它们具有相同的名称,所以元数据无法解析引用


幸运的是,我没有使用相同名称的回调,但我在这个问题上坚持了一段时间,因为我刚刚设置了一些虚拟方法来进行操作。

IService2存在吗?您要删除哪个端点才能使其正常工作?是的,两者都存在,我可以从WCF服务库的app.config中删除任一端点,客户端中的服务引用会找到我没有删除的端点。我通过创建一个默认的WCF服务库再次尝试了它。然后,我添加了一个带有ServiceContract属性的接口,并在我的服务中实现了该接口,并设置了与我发布的类似的WCF配置。我使用了默认的wsHttpBinding,在测试客户端尝试解析服务引用时得到了相同的结果。