Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以从web服务而不是客户端启动连接?_C#_Asp.net_Web Services_Wcf_Soap - Fatal编程技术网

C# 是否可以从web服务而不是客户端启动连接?

C# 是否可以从web服务而不是客户端启动连接?,c#,asp.net,web-services,wcf,soap,C#,Asp.net,Web Services,Wcf,Soap,我有一个SOAP WCF web服务,它将一些XML消息转发到另一台机器上的TCP端口(通过HttpWebRequest post)。我们使用此web服务的原因是,可以轻松地将其配置为使用具有客户端和服务器证书的双向SSL。 它工作正常,只是在HttpWebRequest结束时,web服务没有向客户端发送FIN消息(因为在该端接收到FIN)。web服务和客户端之间的连接之所以结束,是因为客户端将在超时后(当KeepAlive为true时)或在收到应答后(当KeepAlive为false时)立即发

我有一个SOAP WCF web服务,它将一些XML消息转发到另一台机器上的TCP端口(通过HttpWebRequest post)。我们使用此web服务的原因是,可以轻松地将其配置为使用具有客户端和服务器证书的双向SSL。 它工作正常,只是在HttpWebRequest结束时,web服务没有向客户端发送FIN消息(因为在该端接收到FIN)。web服务和客户端之间的连接之所以结束,是因为客户端将在超时后(当KeepAlive为true时)或在收到应答后(当KeepAlive为false时)立即发送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(…)
是一种扩展方法,它执行实际的Post。

最终,实现这一点并不难:

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