0

我在此创建了一个示例 WCF 休息模板 WebApi,我在运行服务时使用实体框架获取数据,因为它返回显示结果的字符串值,但在 json 值末尾添加 XML 代码,如下所示我解决这个问题。

[{"AccountId":1,
  "AccountNumber":"AC001",
  "AccountType":"Restaurant",
  "BusinessName"‌​:"Red SpiceInc",
  "PrimaryContactFirstName":"Varma",
  "PrimaryContactLastName":"Bhupatiraju",
  "P‌​rimaryContactPhone":"(949) 374 2114",
  "PrimaryContactEmail":"redspice@mybusinessapp.com",
  "AccountGuid":"918D3E66-CEFE-11E0-8C2F-0C0B4824019B",
  "EntityState":1,"EntityKey":null}]
<?xml version="1.0" encoding="utf-8"?><Stream p1:nil="true" xmlns:p1="w3.org/2001/XMLSchema-instance"; />

我的代码

[WebGet(UriTemplate = "GetSetting({LocationGuid},{settingName})", ResponseFormat = WebMessageFormat.Json)]
public Stream GetSetting(string LocationGuid, string settingName)
{
    string str = string.Empty;
    string strJSON = string.Empty;
    dynamic contactResponse = new JsonObject();
    List<setting> Result;
    Result = new List<setting>();
    var Location = from acc in objEntity.locations where acc.LocationGuid == LocationGuid select acc;
    if (Location.Count() > 0)
    {
        var LocationId = (from acc in objEntity.locations where acc.LocationGuid == LocationGuid select acc).First();
        var objSetting = from cat in objEntity.settings where cat.SettingName == settingName & cat.LocationId == LocationId.LocationId select cat;
        setting SettingList = new setting();
        foreach (setting setting in objSetting)
        {
            setting Settinglist = new setting();
            Settinglist.SettingId = setting.SettingId;
            Settinglist.AccountId = setting.AccountId;
            Settinglist.LocationId = setting.LocationId;
            Settinglist.SettingName = setting.SettingName;
            Settinglist.SettingValue = setting.SettingValue;
            Settinglist.FieldType = setting.FieldType;
            Result.Add(Settinglist);
        }

        JavaScriptSerializer js = new JavaScriptSerializer();
        strJSON = js.Serialize(Result);
        WebOperationContext.Current.OutgoingResponse.ContentType = "application/json; charset=utf-8";
        return new MemoryStream(Encoding.UTF8.GetBytes(strJSON));
    }
    else
    {
        return null;
    }
}

请帮我解决这个问题。

4

2 回答 2

1

我相信返回 POCO 就足够了,方法签名是

public List<setting> GetSetting(string, string)

WCF Web API 将根据您的请求标头(接受:application/json 或 application/xml)为您将对象序列化为 json 或 xml

于 2011-09-01T04:39:09.723 回答
0

正如 misaxi 的响应中提到的,WebApiWebGet操作通常不需要关心如何返回响应。Web 操作的职责是简单地返回数据。例如...

[WebGet(UriTemplate = "GetSetting({LocationGuid},{settingName})"]
public List<setting> GetSetting(string LocationGuid, string settingName)
{
    List<setting> Result = null;
    var Location = from acc in objEntity.locations where acc.LocationGuid == LocationGuid select acc;
    if (Location.Count() > 0)
    {
        Result = new List<setting>();
        ....
        foreach (setting setting in objSetting)
        {
            ....
            Result.Add(Settinglist);
        }
     }
     return Result;
}

客户端接收 XML、JSON、JSONP、HTML 等的事实取决于客户端(连同服务器端支持)。客户端的请求标头将包含看起来像Accept: application/jsonAccept: application/xml客户端所追求的任何表示的内容。WebApi 预装了一些标准格式,XML(默认)和 Json。您可以根据需要引入更多格式以接受更多样化的Accept: ....标头集,但是从您的数据到这些请求格式的转换通常超出您的 Web 操作的范围,并且依赖于您设置的格式化程序(或已设置默认情况下)当您的服务初始化时。

Likewise, WebPost operations generally do not care if the body of the request was XML or JSON, by the time the operation is invoked, formatters have already translated that payload into your method's parameters.

于 2011-09-01T16:48:41.560 回答