【问题标题】:wcf rest json return collectionwcf rest json 返回集合
【发布时间】:2014-10-22 09:49:25
【问题描述】:

我正在尝试构建一个 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;
}

【问题讨论】:

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


【解决方案1】:

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

您的(一般)错误的可能性很小,因为您可能不知道内部异常:

  • 对象 CTMode 缺少 DataContract、DataMember 属性。
  • 对象 CTMode 是一个缺少属性或具有无法序列化的错误值的枚举
  • 之前的连接没有正确关闭
  • 途中有代理服务器,您需要绕过它

【讨论】:

  • 该错误仅在 IList != null 时出现。如果该方法返回 IList == null,则一切正常。没有代理服务器,连接正确关闭。我认为问题出在 CTMode 序列化中。 CTMode 类用于处理 NHibernate 对象,如您所说,我将此类添加到 DataContract。以写格式道歉,但我是在stackoverflow中写的菜鸟,我仍然没有在这个页面上正确写。
  • 我向 DataContract 添加了新类,现在它可以工作了。我编辑了答案以添加修改。谢谢 Wojciech。
猜你喜欢
  • 2019-04-04
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
  • 2014-04-02
  • 2020-11-04
  • 1970-01-01
  • 2017-01-12
  • 1970-01-01
相关资源
最近更新 更多