具有异步模式的WCF ChannelFactory

时间:2014-08-14 03:17:35

标签: c# wcf

我有以下服务合同

[ServiceContract]
public interface IDataService
{
    [OperationContract]
    void UpdateProcessingState(ActionState state);
}

但是我想允许客户端ChannelFactory访问异步模式,所以我继承了上面的合同

[ServiceContract]
public interface IDataServiceClient : IDataService
{
    [OperationContract(AsyncPattern = true, IsOneWay = true)]
    IAsyncResult BeginUpdateProcessingState(ActionState state, AsyncCallback asyncCallback, object obj = null);

    void EndUpdateProcessingState(IAsyncResult r);

}

我希望这可以让我在服务器上使用以下内容而无需实现异步存根,即

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class DataService : IDataService
{
    public void UpdateProcessingState(ActionState state)
    {
    }

    //public IAsyncResult BeginUpdateProcessingState(ActionState state, AsyncCallback asyncCallback, object obj = null)
    //{
    //    throw new NotImplementedException();
    //}

    //public void EndUpdateProcessingState(IAsyncResult r)
    //{
    //    throw new NotImplementedException();
    //}
}

让客户ChannelFactory访问异步方法

ChannelFactory = new ChannelFactory<IDataServiceClient>(GetBinding(), GetEndpoint());
ChannelFactory.Endpoint.Behaviors.Add(new ProtoEndpointBehavior());
_proxy = ChannelFactory.CreateChannel();

Proxy.BeginUpdateProcessingState(state, ar =>
{

});

然而,客户端正在抛出以下错误,我想我可以理解为什么,我不知道如何解决它,或者即使我想要做的事情是可能的,我也突出了我认为的部分与问题相关

  

类型'IDataService'中的同步OperationContract方法'UpdateProcessingState'与异步OperationContract方法'BeginUpdateProcessingState'和'EndUpdateProcessingState'匹配,因为它们具有相同的操作名称'UpdateProcessingState'。 当同步OperationContract方法与一对异步OperationContract方法匹配时,两个OperationContracts必须具有“Action”属性的相同值。在这种情况下,值是不同的。要修复它,请更改其中一个OperationContracts的Action属性以匹配另一个。或者,更改其中一个方法的名称将阻止匹配。

注意:

我知道我可以将存根添加到服务中,一切都很好,但是能够将合同分成服务和客户端,或者更具体地说,是从服务合同继承的客户合同

这可能吗?

1 个答案:

答案 0 :(得分:0)

似乎我在基础合同中放置了名称空间和名称

[ServiceContract(Namespace = "http://schemas.jcurve.com/", Name = "DataService")]
public interface IDataService
{
}

并在inhertied contract行动中引用它似乎一切正常

[OperationContract(AsyncPattern = true, 
    Action = "http://schemas.jcurve.com/DataService/UpdateProcessingState", 
    ReplyAction = "http://schemas.jcurve.com/DataService/UpdateProcessingStateResponse")]
IAsyncResult BeginUpdateProcessingState(ActionState state, AsyncCallback asyncCallback, object obj = null);

注意: 也许有人对此有更多话要说,但是我需要在合同中添加名称空间和名称,并在动作中正确格式化网址

即在这种情况下采取行动

http://<NameSpace>/<Name>/<Method>

并回复行动

http://<NameSpace>/<Name>/<Method>Repsonse