是否可以从Web服务而不是客户端发起连接?

时间:2014-05-13 07:23:51

标签: c# asp.net web-services wcf soap

我有一个SOAP WCF Web服务,它将一些XML消息转发到另一台机器上的TCP端口(通过HttpWebRequest帖子)。我们使用此Web服务的原因是它可以轻松配置以使用具有客户端和服务器证书的双向SSL。 除了HttpWebRequest结束后我的Web服务没有向客户端发送FIN消息的部分(因为在那一侧收到FIN)之外,它工作正常。 Web服务和客户端之间的连接只是因为客户端在超时(KeepAlive为真)后立即发送FIN或者在收到答案后立即发送FIN(当KeepAlive为false时)。因此,连接结束始终由客户端启动。

是否可以让Web服务结束连接(让Web服务将FIN发送给客户端)?

我已经尝试过这样的事件处理程序而没有运气:

OperationContext.Current.OperationCompleted += DisconnectClientImmediatelyAfterResponseEventHandler;

private void DisconnectClientImmediatelyAfterResponseEventHandler(object sender, EventArgs e)
{
    OperationContext.Current.Channel.Close();
}

这是我的邮政行动的完整代码:

public Message Post(Message postRequest)
{
      string bodyOfPostRequest = GetBodyContents(postRequest);            

      IHttpWebRequestWrap remoteRequest = CreateHttpWebRequest();
      try
      {
          using (Stream remoteResponseStream = remoteRequest.Post(bodyOfPostRequest, RemoteRequestContentType))
          {
              string responseMessage = StreamToString(remoteResponseStream);                    
              Message reply = CreateReplyMessage(postRequest.Version, postRequest.Headers.Action, responseMessage);

              return reply;
          }
      }
      catch (Exception ex)
      {
          _log.Fatal("The following exception occured.", ex);
          throw;
      }
}

remoteRequest.Post(...)是一种实际发布的扩展方法。

1 个答案:

答案 0 :(得分:0)

最后,实现这一目标并不是那么难:

在web.config中,serviceHostingEnvironment的aspNetCompatibilityEnabled属性必须设置为true:

<system.serviceModel>
  ...
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>

然后在发送响应后立即关闭连接:

private void DisconnectClientImmediatelyAfterResponseEventHandler(object sender, EventArgs e)
{
    HttpContext.Current.Response.Close();
}