我对来自asp.net应用程序的WCF服务调用存在很大疑问。我实现了duplexchannel并回拨合同。我使用的是conurrency模式是可重入的,而实例模式=每个会话。我可以调用wcf服务,它会触发回调方法。直到这一点,一切都很好。
但我想的是,当我第一次调用服务时,我使用waithandler对象在该服务方法中保持该调用并触发回调方法。此回调命中客户端代码,并再次从客户端调用同一服务类中的另一个方法来释放该等待处理程序锁。当我使用等待处理程序锁定第一个调用并触发回调方法时,它正在回调客户端,之后,它再次调用同一服务中的另一个方法。但我有时间超时...举行第一次通话并在同一服务中进行第二次通话可能吗?我是ASP.Net的新手
[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IMyServiceCallBacks))]
public interface IMyService
{
[OperationContract]
string GetData1();
[OperationContract]
void GetData2(bool isOK);
}
public interface IMyServiceCallBacks
{
[OperationContract(IsOneWay = true)]
void MyCallBack();
}
这是服务类
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Reentrant)]
public class MyService : IMyService
{
EventWaitHandle waitHandle;
bool isook = false;
public MyService()
{
}
string IMyService.GetData1()
{
waitHandle = new EventWaitHandle(false, EventResetMode.AutoReset);
CallMethod();
bool isOK = waitHandle.WaitOne();
return "success";
}
private void CallMethod()
{
OperationContext.Current.GetCallbackChannel<IMyServiceCallBacks>().MyCallBack();
}
public void GetData2(bool isOK)
{
isook = true;
waitHandle.Reset();
}
}
以下是客户端代码
[CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant, UseSynchronizationContext = false, IncludeExceptionDetailInFaults = true)]
public class MyProxyClient : MyService, MyServiceCallback
{
bool isOK;
private MyServiceClient caServiceProxy
private InstanceContext myInstanceContext;
public MyService()
{
myInstanceContext = new InstanceContext(this);
EndpointAddress endPointAddress = new EndpointAddress("http://localhost:2222222/MyWCF1/MyService.svc");
caServiceProxy = new MyServiceClient(myInstanceContext, new WSDualHttpBinding(), endPointAddress);
}
public string GetData1()
{
string hhhh = caServiceProxy.GetData1();
return hhhh;
}
public void GetData2(bool isOK)
{
caServiceProxy.GetData2(isOK); // here it is processing but finally time out
}
// This is the call back
public void MyCallBack()
{
isOK = true;
GetData2(isOK);
}
}
以下是网络配置serviceModeltag
<system.serviceModel>
<services>
<service name="MyABService.MyService" behaviorConfiguration="WCFDuplex.Service1Behavior">
<!-- Service Endpoints -->
<endpoint address="" binding="wsDualHttpBinding" contract="MyABService.IMyService">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="WCFDuplex.Service1Behavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
我使用svcutil生成代理。 任何想法???
由于
答案 0 :(得分:0)
1)依靠不稳定的信道并保持服务方法调用是个坏主意。通话不应该长时间运行。因此Http双工基于定期轮询。 TCP更好,但对于这种情况,我建议对Method1使用OneWay = true的操作。服务器可以注册客户端,记住/管理状态,做一些工作。客户必须根据回调选择行为。您可以使用AutoResetEvent / ManualResetEvent / TPL基础结构进行后台线程交换/同步。
2)我90%确定通过OneWay = false的服务方法内部回调通知客户端会导致错误。见前见。 here
我写道,您可以通过延迟回调(Task.Factory.StartNew / QueueUserWorkItem等)来避免问题,以允许方法完成。