我有以下服务合同
[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属性以匹配另一个。或者,更改其中一个方法的名称将阻止匹配。
注意:
我知道我可以将存根添加到服务中,一切都很好,但是能够将合同分成服务和客户端,或者更具体地说,是从服务合同继承的客户合同
这可能吗?
答案 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