问题描述
|
我有基于本教程的应用程序
我用来从服务获取用户列表的方法:
public class PBMBService : IService
{
public ServiceResponse UserList()
{
try
{
sql.open();
List<User> result = new List<User>();
//filling list from database
return new ServiceResponse(SRFlag.OK,result);
}
catch (Exception ex)
{
return new ServiceResponse(SRFlag.EXCEPTION,ex);
}
}
//other methods
}
服务主要功能:
class Program
{
static void Main(string[] args)
{
Uri baseAddress = new Uri(\"http://localhost:8000/PBMB\");
ServiceHost selfHost = new ServiceHost(typeof(PBMBService),baseAddress);
try
{
selfHost.AddServiceEndpoint(
typeof(IService),new WSHttpBinding(),\"PBMBService\");
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
selfHost.Description.Behaviors.Add(smb);
selfHost.open();
Console.WriteLine(\"Serwis gotowy.\");
Console.WriteLine(\"Naciśnij <ENTER> aby zamknąć serwis.\");
Console.WriteLine();
Console.ReadLine();
selfHost.Close();
}
catch (CommunicationException ce)
{
Console.WriteLine(\"Nastąpił wyjątek: {0}\",ce.Message);
selfHost.Abort();
}
}
}
其他课程在
Classes.cs
namespace PBMB
{
public enum SRFlag { OK,EXCEPTION };
[DataContract]
public class ServiceResponse
{
private SRFlag _flag;
private Object _content;
public ServiceResponse(SRFlag srf,Object c)
{
_flag = srf;
_content = c;
}
[DataMember]
public SRFlag Flag
{
set { _flag = value; }
get { return _flag; }
}
[DataMember]
public Object Content
{
set { _content = value; }
get { return _content; }
}
}
[DataContract]
public class User
{
[DataMember]
public string Login { get; set; }
[DataMember]
public string FirstName { get; set; }
[DataMember]
public string MiddleName { get; set; }
[DataMember]
public string LastName { get; set; }
[DataMember]
public string Email { get; set; }
}
}
我的问题是:为什么我不能发送任何非通用类型的东西?
我需要发送List<User>
或User[]
,但我什至不能发送int[2]
(可以发送int
或string
)。
当我尝试将列表从服务发送到客户端时,服务可以正常工作,但是客户端出现异常:
An error occurred while receiving the HTTP response to http://localhost:8000/PBMB/PBMBService.
This Could be due to the service endpoint binding not using the HTTP protocol.
This Could also be due to an HTTP request context being aborted by the server
(possibly due to the service shutting down). See server logs for more details.
解决方法
我猜发生这种情况是因为User类被声明为DataContract,并且数据序列化程序能够对其进行序列化和反序列化。
但是,将对象声明为返回的响应的一部分是一个非常糟糕的主意。您应该始终指定返回的类型。返回对象违反消息传递原则。服务客户端应该能够从wsdl获取所有信息,如果将响应的一部分定义为对象(哪种对象?.net特定对象?等),则基本上是不可能的。消息传递的原理与面向对象的原理完全不同。原则。
另外,如果要将异常返回给客户端,请检查FaultException。
更新:
怎么解决呢?
更改设计-不要指望可以发送任何对象。当涉及SOA和消息传递时,这是一个错误的假设。
如果要发送基本类型的对象(如int),则字符串仅在响应中声明将返回
public string Content
或public int Number
-就像您所做的一样,但是要明确声明类型(不要使用object)。如果要返回自定义类(即用户),请像您一样声明它(DataContract,DataMember等-但这不是必需的),然后编写write11ѭ。它将正常工作,并且客户将知道在服务响应中期望什么。