WCF只有单向调用正在工作

时间:2017-04-17 06:23:08

标签: c# wcf

出于某种原因,当我调用服务方法IsOneWay=true一切正常时,每次都会按预期返回回调。但是当我使用IsOneWay=false的方法时,客户端没有显示错误,但是没有调用服务器端的方法。可能是什么原因造成的?我所做的只是在逻辑上进行小型重构,处理客户端的服务实例。

客户端逻辑

public interface ISomeServiceClient
{
    IService Instance { get; }
}

public class SomeServiceClient : ISomeServiceClient
{
    private ServiceClient client;
    private IServiceCallback callback;
    private System.ServiceModel.InstanceContext instanceContext;

    public SomeServiceClient()
    {
        this.callback = new ServiceCallback();
        this.instanceContext = new System.ServiceModel.InstanceContext(callback);
        this.client = new ServiceClient(instanceContext);
    }

    public IService Instance
    {
        get { return this.client; }
    }
}

public class SomeViewModel
{
    private readonly IService serviceClient;
    public SomeViewModel()
    {
        this.serviceClient = SharedService.Instance.ServiceClient   
    }   
    public void RetrieveData()
    {
      // Then I just call server side like this
        this.serviceClient.GetSomeData();
    }
}

注意:SharedService是一个sigleton,如果尚未初始化,则会返回IService SomeServiceClient的新实例。

服务器端数据合同

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.Single)]
public partial class Service : IService
{
}

[ServiceContract(CallbackContract = typeof(IServiceCallback))]
public interface IService : ISomeDataService
{   
}

[ServiceContract(CallbackContract = typeof(ISomeDataServiceCallback))]
public interface ISomeDataService
{
     [OperationContract(IsOneWay = false)]
     List<Data> GetSomeData();
}

我不知道是否有必要同时显示服务配置,但这里也是如此..

<system.serviceModel>
    <services>
      <service name="MyService.Library.Models.Service">
        <host>
          <baseAddresses>
          <!-- ip changed for demo purposes -->
            <add baseAddress="net.tcp://111.111.11.111:2222/MyService" />
          </baseAddresses>
        </host>
        <endpoint address="net.tcp://111.111.11.111:2222/MyService" 
                  binding="netTcpBinding" 
                  bindingConfiguration="TcpConfig" 
                  contract="MyService.Library.Interfaces.IService" />
      </service>
    </services>
    <bindings>
      <netTcpBinding>
        <binding name="TcpConfig">
          <security mode="None">
          </security>
        </binding>
      </netTcpBinding>
    </bindings>
</system.serviceModel>

我还尝试使用其他方法,这些方法不是单向调用,也不是调用服务。 正如我所提到的,配置文件中没有更改任何代码。

1 个答案:

答案 0 :(得分:0)

由于您在服务中使用Callback方法,因此您使用Duplex合约作为客户端和服务器之间的消息传递模式。

双工合同包含客户端和服务器之间的两个单向合同,并且不要求方法调用是相关的。我们通常在您的服务必须向客户查询更多信息或在客户端明确提出事件时使用此类合同