NetNamedPipeBinding ActionNotSupportedException

本文关键字:ActionNotSupportedException NetNamedPipeBinding | 更新日期: 2023-09-27 18:12:51

我正在运行一个服务,看起来像MS计算器的例子。这是ServiceContract契约接口。

[ServiceContract(Namespace = "http://localhost:8000/Calculator")]
public interface ICalculator
{
    [OperationContract]
    double Add(double n1, double n2);
    [OperationContract]
    double Subtract(double n1, double n2);
    [OperationContract]
    double Multiply(double n1, double n2);
    [OperationContract]
    double Divide(double n1, double n2);
}

我这样设置服务:

public partial class Service1: ServiceBase
{
    private static readonly string sNameOfService = "CalculatorService";
    public static string NameOfService
    {
        get { return sNameOfService; }
    }
    public ServiceHost serviceHost = null;
    public Service1()
    {
        InitializeComponent();
        this.ServiceName = sNameOfService;
        this.CanStop = true;
        this.CanPauseAndContinue = false;
        this.AutoLog = true;
    }
    protected override void OnStart(string[] args)
    {
        if (serviceHost != null)
            serviceHost.Close();
        Uri[] baseAddress = new Uri[]{
      new Uri("net.pipe://localhost")};
        string PipeName = "Calculator";
        serviceHost = new ServiceHost(typeof(CalculatorImplementation), 
        serviceHost.AddServiceEndpoint(typeof(ICalculator), new NetNamedPipeBinding(), PipeName);
        serviceHost.Open();
    }
    protected override void OnStop()
    {
        if (serviceHost != null && serviceHost.State != CommunicationState.Closed)
        {
            serviceHost.Close();
            serviceHost = null;
        }
    }
}

我成功安装了服务,并且它在我的本地机器上运行。下一步是建立一个客户端,访问服务,我以以下方式完成。

public interface ICalculator
{
    // die einzelnen Teile können auch als Vorgänge bzw. Kanäle verstanden werden
    // öffentliche Teile des Interfaces definieren
    // diese werden durch das OperationContract Attribut identifiziert
    [OperationContract]
    double Add(double n1, double n2);
    [OperationContract]
    double Subtract(double n1, double n2);
    [OperationContract]
    double Multiply(double n1, double n2);
    [OperationContract]
    double Divide(double n1, double n2);
}
class Program
{
    static void Main(string[] args)
    {
        ChannelFactory<ICalculator> pipeFactory = new ChannelFactory<ICalculator>(new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/Calculator"));
        ICalculator pipeProxy = pipeFactory.CreateChannel();
        double erg = pipeProxy.Add(5, 6);
        Console.WriteLine("Ergebnis: {0}", erg.ToString());
        Console.ReadLine();
    }
}

但是当尝试调用"pipeProxy.Add()"时,我得到一个ActionNotSupportedException,我不知道为什么会发生这种情况。是我的服务器没有正确设置,还是我在客户端中出现了问题,或者我错过了设置一些所需的属性?我浏览了多个使用命名管道的示例,但没有找到任何可以帮助我解决问题的方法。

此外,我问自己,有什么区别,我应该在哪里使用ServiceHost实现和NamedPipeClientStream/NamedPipeServerStream实现?

NetNamedPipeBinding ActionNotSupportedException

ActionNotSupportedException在客户端使用服务器未知的SOAP操作时被抛出。默认情况下,SOAP操作的名称是从服务契约和操作契约的类型中推断出来的。

在你的例子中,我看到合同定义了两次。这是否意味着服务和客户端都有自己的ICalculator定义?在这种情况下,无需进一步努力,这两个契约就不一样了,因为它们很可能位于不同的名称空间中,第一个契约指定了自己的名称空间,而第二个契约没有。如果您希望使用相同的接口,请将其置于分离的程序集中,并从服务和客户端引用该程序集。否则,您将不得不检查ServiceContractOperationContract属性,并确保Namespace, ActionReplyAction的值在两个接口中是相同的。

相关文章:
  • 没有找到相关文章