Использование канала WCF из IIS ASP.NET IHTTPMODULE
-
27-10-2019 - |
Вопрос
У меня есть проект ASP.NET, который включает в себя использование пользовательского IHTTPModule. Этот модуль будет расположен в трубопроводе, и когда определенные критерии соответствуют, он должен вызвать метод на службе WCF, размещенном в простом приложении C# консоли на той же машине.
Код для модуля ниже:
using System;
using System.Collections.Generic;
using System.Text;
using System.Web.SessionState;
using System.Web;
using System.Diagnostics;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Configuration;
using System.ServiceModel;
using SimpleFarmStateServer;
namespace SimpleFarm
{
public class SimpleFarmModuleSS : IHttpModule, IRequiresSessionState
{
protected string cache_directory = "";
// WCF
ChannelFactory<IStateServer> factory;
IStateServer channel;
public void Dispose() { }
public void Init(System.Web.HttpApplication context)
{
context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute);
setupFactory();
}
void setupFactory()
{
factory = new ChannelFactory<IStateServer>(
new NetNamedPipeBinding(),
"net.pipe://localhost/StateServer");
}
void context_PreRequestHandlerExecute(object sender, EventArgs e)
{
try
{
if (factory.State != CommunicationState.Opened)
setupFactory();
channel = factory.CreateChannel();
channel.LogAccess("Hello World!");
}
catch (Exception ex)
{
}
finally
{
factory.Close();
}
}
}
}
Моя проблема в том, что это работает в первый раз, но затем последующие попытки вызвать это сообщение об ошибке
Объект связи, System.ServiceModel.Channels.ServiceChannel, не может использоваться для общения, поскольку он находится в неисправном состоянии.
Кажется, что я делаю что -то не так, и я новичок в WCF в целом, так что это очень вероятно.
Я думаю, что проблема связана с воссозданностью канала, и это вызывает неисправное состояние.
Решение
Конкретная ошибка, вероятно, означает, что заводская ошибка, выброшенная исключение (которое вы глотаете), а затем, когда Block выполняется, вызов Factory.Close () не удастся, потому что завод потерпел неудачу (если объект WCF ошибается, вам нужно Называть Abort () на нем, а не Close ()).