【问题标题】:Is it possible to initiate a connection ending from the web service, instead of the client?是否可以从 Web 服务而不是客户端发起连接?
【发布时间】:2014-05-13 07:23:51
【问题描述】:

我有一个 SOAP WCF Web 服务,它将一些 XML 消息转发到另一台机器上的 TCP 端口(通过 HttpWebRequest 帖子)。我们使用这个 Web 服务的原因是它可以很容易地配置为使用带有客户端和服务器证书的两种方式的 SSL。 它工作正常,除了在 HttpWebRequest 结束后我的 Web 服务没有向客户端发送 FIN 消息的部分(因为在那一侧收到了 FIN)。 Web 服务与客户端之间的连接仅因为客户端将在超时后(当 KeepAlive 为真时)或在收到答案后(当 KeepAlive 为假时)立即发送 FIN。所以连接结束总是由客户端发起的。

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

我已经尝试过使用这样的事件处理程序,但运气不佳:

OperationContext.Current.OperationCompleted += DisconnectClientImmediatelyAfterResponseEventHandler;

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

这是我的 Post 操作的完整代码:

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(...) 是一个扩展方法,它执行实际的发布。

【问题讨论】:

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


    【解决方案1】:

    最终做到这一点并不难:

    在 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();
    }
    

    【讨论】:

      猜你喜欢
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      • 2020-04-08
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多