【发布时间】:2020-01-01 19:24:29
【问题描述】:
我正在尝试将现有的 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 并从类型继承 ServiceContract ConsoleApp25.ISOA添加。契约继承只能在 接口类型。如果一个类用 ServiceContractAttribute 标记, 它必须是层次结构中的唯一类型 服务合同属性。考虑移动 ServiceContractAttribute 在 ConsoleApp25.ISOA 类型上添加一个单独的接口,该类型 ConsoleApp25.ISOAAdd 实现。
我。 e.由于某种原因,应用程序看不到接口已经用 ServiceContract 装饰,但是当我装饰类和接口时,它可以看到装饰(两者),这导致了上面的错误。我该如何解决?
【问题讨论】:
-
显然应该是
new ServiceHost(ServiceType, ...和host.AddServiceEndpoint(typeof(ISOAAdd), ... -
非常感谢!你拯救了我的一天。