C# 是否可以从web服务而不是客户端启动连接?
我有一个SOAP WCF web服务,它将一些XML消息转发到另一台机器上的TCP端口(通过HttpWebRequest post)。我们使用此web服务的原因是,可以轻松地将其配置为使用具有客户端和服务器证书的双向SSL。 它工作正常,只是在HttpWebRequest结束时,web服务没有向客户端发送FIN消息(因为在该端接收到FIN)。web服务和客户端之间的连接之所以结束,是因为客户端将在超时后(当KeepAlive为true时)或在收到应答后(当KeepAlive为false时)立即发送FIN。因此,连接结束总是由客户端发起的 是否可以让web服务结束连接(让web服务将FIN发送到客户端) 我已经尝试过使用这样的事件处理程序,但运气不好: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时)立即发
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();
}