wcf rest json返回集合

时间:2014-10-22 09:49:25

标签: c# json wcf rest wcf-data-services

我正在尝试构建 Restful WCF服务,它以 JSON 格式返回数据。我的第一个方法工作正常,但是当我尝试返回一个集合时,我的测试程序会收到下一个异常:

  

无法将数据写入传输连接。远程主机强行关闭现有连接。

我的服务代码:

[ServiceContract]
public interface IService
{ 
  [OperationContract]
    [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "/GetModes")]
    OGetModesResponse OGetModes(OGetModesRequest oGetModes);
}
[DataContract]
public class OGetModesRequest
{
    private String m_sTicket;

    [DataMember]
    public String prTicket
    {
        get { return m_sTicket; }
        set { m_sTicket = value; }
    }
}

[DataContract]
public class OGetModesResponse
{
    [DataMember]
    public string sTicket;
    [DataMember]
    public emStatus emStatus;
    [DataMember]
    public IList<CTMode> aoModes;
}

我的测试程序:

OGetModesRequest oGetModes = new OGetModesRequest { prTicket = sTicket };
ser = new DataContractJsonSerializer(typeof(OGetModesRequest));
mem = new MemoryStream();
ser.WriteObject(mem, oGetModes);
webClient = new WebClient();
webClient.Headers["Content-type"] = "application/json";
webClient.Encoding = Encoding.UTF8;
//Exception here
bData = webClient.UploadData("http://localhost:26104/Service.svc/GetModes", "POST", mem.ToArray()); 
stream = new MemoryStream(bData);
obj = new DataContractJsonSerializer(typeof(OGetModesResponse));
OGetModesResponse OResultModes = obj.ReadObject(stream) as OGetModesResponse;

我调试我的服务并且工作正常。可能会发生什么?

感谢您的帮助。

编辑(解决方案): CTMode是我使用NHibernate获取的管理对象所使用的类,因此我创建了一个名为CMode的新类序列化

[DataContract]
public class OGetModesResponse
{
    [DataMember]
    public string sTicket;
    [DataMember]
    public emStatus emStatus;
    [DataMember]
    public IList<CMode> aoModes;
}
[Serializable]
public class CMode
{
    public Int32 nId;
    public Int32 nCode;
    public String sName;
}

1 个答案:

答案 0 :(得分:0)

尝试检查内部异常并在服务器上添加一些日志记录/跟踪。

您的(通用)错误几乎没有可能,因为您可能不了解内部异常:

  • object CTMode缺少DataContract,DataMember属性。
  • object CTMode是一个枚举,缺少属性或具有不能序列化的错误值
  • 以前的连接未正确关闭
  • 路上有一个代理服务器,你需要绕过它