我正在尝试从WCF服务返回JSONified匿名类型。
我成功地这样做了,但我正在寻找更好的选择..
// In IService
[OperationContract]
[FaultContract(typeof(ProcessExecutionFault))]
[Description("Return All Room Types")]
[WebInvoke(UriTemplate = "/GetAllRoomTypes", Method = "GET", RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
Stream GetAllRoomTypes();
// In Service Implementation
[LogBeforeAfter]
Stream GetAllRoomTypes()
{
try
{
var allRoomTypes = Helper.GetAllRoomTypes();
var stream = new MemoryStream();
var writer = new StreamWriter(stream);
writer.Write(allRoomTypes);
writer.Flush();
stream.Position = 0;
return stream;
}
catch (Exception ex)
{
TableLogger.InsertExceptionMessage(ex);
return null;
}
}
// In Business Logic:
public string GetAllRoomTypes(){
try
{
return CustomRetryPolicy.GetRetryPolicy().ExecuteAction(() =>
{
using (var context = new DatabaseEntity())
{
var retResult = from v in context.RoomMasters select new { Id = v.RoomTypeID, Type = v.RoomType };
var retResult1 = retResult.ToJson();
return retResult1;
}
}
);
}
catch (Exception ex)
{
Trace.Write(String.Format("Exception Occured, Message: {0}, Stack Trace :{1} ", ex.Message, ex.StackTrace));
return null;
}
}
我的问题是,有更好的方法吗?
答案 0 :(得分:0)
尝试使用JavaScriptSerializer
using (var context = new DatabaseEntity())
{
var retResult = from v in context.RoomMasters select new { Id = v.RoomTypeID, Type = v.RoomType };
JavaScriptSerializer serializer = new JavaScriptSerializer();
var output = serializer.Serialize(retResult);
return output;
}
答案 1 :(得分:0)
使用类作为数据协定而不是直接返回json。然后,在您的方法中,只返回数据协定类的列表或数组。 WCF将负责将其序列化为配置的格式(JSON或XML)。
[DataContract]
public class RommDto{
[DataMember]
public int Id {get; set;}
[DataMember]
public RoomType Type {get; set;}
}
.....
[LogBeforeAfter]
RoomDto[] GetAllRoomTypes()
{
....
}