我正在尝试将现有的WCF服务从VS2015升级到VS2019,但是VS2019中的接口/类服务属性似乎有问题。
我创建了以下短代码示例以在此处演示问题:
using System;
using System.ServiceModel;
using System.ServiceModel.Description;
namespace ConsoleApp25
{
[ServiceContract]
public interface ISOAAdd
{
[OperationContract]
double Add(double a, double b);
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class SOAAddImpl: ISOAAdd
{
public double Add(double a, double b)
{
return a + b;
}
}
class Program
{
private static ServiceHost Host;
private const ushort Port = 23456;
static void Main(string[] args)
{
Type ServiceType = typeof(SOAAddImpl);
Host = new ServiceHost(ServiceType, new Uri[] { new Uri(string.Format("http://localhost:{0}/", Port)) });
Host.AddServiceEndpoint(ServiceType, new BasicHttpBinding(), "SOAAddImpl");
ServiceMetadataBehavior Behavior = new ServiceMetadataBehavior();
Behavior.HttpGetEnabled = true;
Host.Description.Behaviors.Add(Behavior);
Host.Open();
Console.ReadKey();
}
}
}
运行此代码时,出现以下异常:
合同类型ConsoleApp25.SOAAddImpl未被赋予ServiceContractAttribute
。为了定义有效合同,必须使用ServiceContractAttribute为指定的类型(合同接口或服务类)赋予属性。
如果将属性添加到类中,则会出现以下异常:
类型为ConsoleApp25.SOAAddImpl的服务类都定义了一个ServiceContract并从类型继承ServiceContractConsoleApp25.ISOAAdd。合同继承只能在接口类型。如果某个类标记有ServiceContractAttribute,它必须是层次结构中唯一的ServiceContractAttribute。考虑移动ServiceContractAttribute在类型ConsoleApp25.ISOAAdd上键入一个单独的接口ConsoleApp25.ISOAAdd实现。
I。 e。由于某种原因,应用程序看不到接口已经用ServiceContract装饰,但是当我装饰类和接口时,它可以看到装饰(两者),这导致上面的错误。我该如何解决?
正如Selvin在注释部分中指出的,您需要将参数服务接口(typeof(ISOAAdd)
)而不是服务对象(typeof(SOAAddImpl)
)发送到ServiceHost.AddServiceEndpoint方法。
Host.AddServiceEndpoint(typeof(ISOAAdd), new BasicHttpBinding(), "SOAAddImpl");