繁体   English   中英

具有异步模式的WCF ChannelFactory

[英]WCF ChannelFactory with Async pattern

我有以下服务合同

[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的“操作”属性必须具有相同的值。 在这种情况下,值是不同的 要修复此问题,请更改其中一个OperationContracts的'Action属性以使其与另一个匹配。 或者,更改其中一种方法的名称将阻止匹配。

注意 :

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

这可能吗?

好像我在基本合同中放了一个名称空间和一个名字

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

并在继承合同中引用它,似乎一切正常

[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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM