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实现?
ActionNotSupportedException
在客户端使用服务器未知的SOAP操作时被抛出。默认情况下,SOAP操作的名称是从服务契约和操作契约的类型中推断出来的。
在你的例子中,我看到合同定义了两次。这是否意味着服务和客户端都有自己的ICalculator
定义?在这种情况下,无需进一步努力,这两个契约就不一样了,因为它们很可能位于不同的名称空间中,第一个契约指定了自己的名称空间,而第二个契约没有。如果您希望使用相同的接口,请将其置于分离的程序集中,并从服务和客户端引用该程序集。否则,您将不得不检查ServiceContract
和OperationContract
属性,并确保Namespace
, Action
和ReplyAction
的值在两个接口中是相同的。