C# WCF.ServiceChannel无法通信,因为';故障状态';服务范围

C# WCF.ServiceChannel无法通信,因为';故障状态';服务范围,c#,wcf,service,C#,Wcf,Service,我正在创建一个自托管的WCF服务 [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")] public interface IStateChecker { [OperationContract] void SetState(string state); } 这是我的服务: public class StateCheckerService : IStateChecker { public

我正在创建一个自托管的
WCF服务

[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
public interface IStateChecker
{
    [OperationContract]
    void SetState(string state);
}
这是我的
服务

public class StateCheckerService : IStateChecker
{
    public void SetState(string state)
    {
        Console.WriteLine($"{DateTime.Now.ToString("dd.MM.yyyy HH:mm:sss")} : {state}");
    }
}
这是我的实施:

//Define baseaddres:
Uri baseAddress = new Uri("http://localhost:8000/ServiceModelSamples/Service");

//create host:
ServiceHost selfHost = new ServiceHost(typeof(StateCheckerService), baseAddress);

try
{
     //Add endpoint to host:
     selfHost.AddServiceEndpoint(typeof(IStateChecker), new WSHttpBinding(), "StateCheckerService");

     //Add metadata exchange:
     ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
     smb.HttpGetEnabled = true;
     selfHost.Description.Behaviors.Add(smb);


     selfHost.Faulted += SelfHost_Faulted;

     //Start service
     selfHost.Open();

     Console.WriteLine("Starting Service...");
     if (selfHost.State == CommunicationState.Opened)
     {
         Console.WriteLine("The service is ready.");
     }

     Console.WriteLine("Press <ENTER> to terminate service.");
     Console.ReadLine();

     //Shutdown service
     selfHost.Close();
}
catch (CommunicationException ce)
{
    Console.WriteLine("An exception occurred: {0}", ce.Message);
    selfHost.Abort();
}

private static void SelfHost_Faulted(object sender, EventArgs e)
{
    ServiceHost host = sender as ServiceHost;
    Console.WriteLine(host?.State);
    Console.WriteLine(e?.ToString());

    host?.Open();
}
我从未进入故障的
SelfHost\u
,我的服务也没有任何
异常

我这样做是因为我想更改客户端在运行时应该连接到的
端点


如果我做错了,请告诉我。否则,任何关于我的代码有什么问题的提示都是非常值得赞赏的。

这个问题很小,但被WCF基础设施(标准模式的奇怪实现)所隐藏

如果你改变

channel?.SetState("Test");

您将看到2条消息:

没有可以接受消息的端点正在侦听。这通常是由不正确的地址或SOAP操作引起的。有关更多详细信息,请参阅InnerException(如果存在)

通信对象System.ServiceModel.Channels.ServiceChannel无法用于通信,因为它处于故障状态

第一个是内部的
catch
捕获的真正异常(类型)

第二个(误导性)异常是类型异常,由使用
块在
末尾调用的
channel.Dispose()
(?!)引发,因此隐藏了原始异常。WCF实现根本没有遵循
Dispose()
不应抛出的规则

话虽如此,问题在于您的客户端端点。根据服务配置,它应该是
“baseAddress/StateCheckerService”
,而当前它只是
“baseAddress”
。因此,只需使用正确的端点地址即可

var endpointAddress = new EndpointAddress(
    "http://localhost:8000/ServiceModelSamples/Service/StateCheckerService");
这个问题就会解决

channel?.SetState("Test");
try
{
    channel?.SetState("Test");
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}
var endpointAddress = new EndpointAddress(
    "http://localhost:8000/ServiceModelSamples/Service/StateCheckerService");