Verwendung eines WCF -Kanals aus einem IIS ASP.NET IHTTPMODULE
-
27-10-2019 - |
Frage
Ich habe ein ASP.NET -Projekt, bei dem ein benutzerdefiniertes IHTTPModule verwendet wird. Dieses Modul befindet sich in der Pipeline und sollte bei bestimmten Kriterien eine Methode auf einem WCF -Dienst aufrufen, das in einer einfachen C# -Konsole -Anwendung auf demselben Computer gehostet wird.
Der Code für das Modul ist unten:
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();
}
}
}
}
Mein Problem ist, dass dies das erste Mal ausgeführt wird, aber nachfolgende Versuche diese Fehlermeldung verursachen
Das Kommunikationsobjekt System.Servicemodel.Channels.servicechannel kann nicht für die Kommunikation verwendet werden, da es sich im fehlerhaften Zustand befindet.
Es scheint, als würde ich etwas falsch machen, und ich bin im Allgemeinen neu bei WCF, also ist das sehr wahrscheinlich.
Ich denke, das Problem umgibt den Channelfactory, das nachgebildet wird, und dies verursacht den fehlerhaften Zustand.
Lösung
Der spezifische Fehler bedeutet wahrscheinlich, dass die fehlerhafte Fabrik eine Ausnahme (die Sie schlucken) und dann, wenn der Block endgültig ausgeführt wird, fehlschlägt die Fabrik. abort () darauf aufzurufen, nicht in der Nähe ()).