目前,我正在尝试实现一个服务器-客户端程序。此项目中使用的模型在共享程序集中定义,并带有属性标记DataContract
。服务器应该像客户端一样使用它们,因此不需要生成两次代码。当客户端向服务器发起请求时,它应该返回一个共享模型的实例,以确保它可以使用方法和构造函数以及数据。
服务器是通过 WCF 服务实现的。在客户端,应通过通道工厂检索数据,而不是通过 .wsdl 文件。
客户端:
private void TestSzenarioOne()
{
var address = new EndpointAddress($"http://{Host}:{Port1}/{ServiceName}");
var binding = new BasicHttpBinding();
var factory = new ChannelFactory<ITestInterface>(binding, address);
var channel = factory.CreateChannel();
var test1 = channel.DoStringTest(); // <-- works fine
var test2 = channel.DoStringEnumerableTest(); // <-- works fine
var test3 = channel.DoTest(); // <-- want to get List<User> error!!!!
}
服务契约共享库:
[ServiceContract]
public interface ITestInterface: IDisposable
{
[OperationContract]
IEnumerable<User> DoTest();
[OperationContract]
string DoStringTest();
[OperationContract]
IEnumerable<User> DoStringEnumerableTest();
来自 WCF 服务的连接已打开,我可以通过 url 访问该服务。
为什么我无法从服务器获取模型对象?任何想法:
错误:通信异常
接收 http://localhost:1800/testService 服务的 HTTP 响应时出错。原因可能是服务端点绑定没有使用 HTTP 协议。另一个可能的原因是 HTTP 请求上下文被服务器中止(可能是由于服务关闭)。更多信息可以在服务器日志中找到。"
用户等级:
[KnownType(typeof(Entity))]
[DataContract]
public class User : Entity
{
[DataMember]
public string Name { get; set; }
[DataMember]
public string ShortName { get; set; }
[DataMember]
public string Password { get; set; }
}
实体:
[DataContract]
public class Entity
{
[DataMember]
public long Id { get; } = 0;
}