[英]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.