【问题标题】:Holding first service call and make second call in WCF from ASP.Net从 ASP.Net 在 WCF 中进行第一次服务调用并进行第二次调用
【发布时间】:2012-12-15 02:43:39
【问题描述】:

我对来自 asp.net 应用程序的 WCF 服务调用有很大的疑问。我实现了双工通道和回调合同。我使用的并发模式是可重入的,而实例模式=每个会话。我可以调用 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);
    }   
 }

下面是 web config 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 来生成代理。 有什么想法???

谢谢

【问题讨论】:

  • 它有助于发布您尝试过的代码(或它的总和)。
  • 上面添加了使用的代码。有什么想法吗?

标签: wcf


【解决方案1】:

1) 依赖不稳定的通道并保持服务方法调用是个坏主意。通话不应该长时间运行。因此Http双工基于定期轮询。 TCP 更好,但对于这种情况,我建议对 Method1 使用 OneWay = true 的操作。服务器可以注册客户端,记住/管理状态,做一些工作。并且客户端必须根据回调选择行为。您可以将 AutoResetEvent/ManualResetEvent/TPL 基础设施用于后台线程交换/同步。

2) 我 90% 确定使用 OneWay = false 的服务方法内的回调通知客户端可能会导致错误。见前。 here

我写道,您可以通过推迟回调(Task.Factory.StartNew/QueueUserWorkItem 等)以允许方法完成来避免问题。

【讨论】:

    猜你喜欢
    • 2011-05-12
    • 1970-01-01
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    相关资源
    最近更新 更多