web-dev-qa-db-ja.com

単一のメソッドのApiControllerでJSONを返す方法は?

現在、私のApiControllersはXMLを応答として返していますが、1つのメソッドについてはJSONを返します。つまり、JSONとして応答を強制するためにグローバルな変更を加えることはできません。

public class CarController : ApiController
{  
    [System.Web.Mvc.Route("api/Player/videos")]
    public HttpResponseMessage GetVideoMappings()
    {
        var model = new MyCarModel();    
        return model;
    }
}

私はこれを試しましたが、モデルをJSON文字列に正しく変換できないようです:

var jsonString = Json(model).ToString();    
var response = this.Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(jsonString, Encoding.UTF8, "application/json");
return response;
12
cool breeze

応答をJSONとして強制的にグローバルに変更できない場合は、次を試してください。

[Route("api/Player/videos")]
public HttpResponseMessage GetVideoMappings()
{
    var model = new MyCarModel();
    return Request.CreateResponse(HttpStatusCode.OK,model,Configuration.Formatters.JsonFormatter);
}

または

[Route("api/Player/videos")]
public IHttpActionResult GetVideoMappings()
{
    var model = new MyCarModel();
    return Json(model);    
}

グローバルに変更する場合は、まずYourProject/App_Start/WebApiConfig.csに移動して以下を追加します。

config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(
config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml"));

Registerメソッドの下部。

次に試してください:

[Route("api/Player/videos")]
public IHttpActionResult GetVideoMappings()
{
    var model = new MyCarModel();
    return Ok(model);    
}
20
Ashiquzzaman

呼び出し元がXMLを要求しているため、XMLはJSONの代わりに返されます。返される形式は、必要なヘッダーを追加し、MVCでJSONを解決できるフィルターを使用してJSONに強制することができます。

public class AcceptHeaderJsonAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        actionContext.Request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));    
    }
}

したがって、この属性を使用してJSON応答を強制するメソッドを修飾し、他のメソッドと同じグローバルJSON構成とシリアル化を維持できます。

3

APIコントローラーの場合、応答の作成方法を決定するのは呼び出し元次第です。 1つのタイプの応答のみを強制するコードを特に追加しない限り。 APIメソッドの簡単な例と、XMLまたはJSONのリクエストと呼ばれる場合の動作を次に示します。

public class XmlEampleController : ApiController
{
    [HttpPost]
    [ActionName("MyOrderAction")]
    public HttpResponseMessage MyOrder([FromBody]MyOder order)
    {
        if (order != null)
        {
            return Request.CreateResponse<MyOder>(HttpStatusCode.Created, order);
        }
        return Request.CreateResponse(HttpStatusCode.BadRequest);
    }

[Serializable]
public partial class MyOder
{
    private string dataField;
    public string MyData
    {
        get
        {
            return this.dataField;
        }
        set
        {
            this.dataField = value;
        }
    }
}

}

サンプル: - Help page display

たぶん問題はWebApiConfigファイルにあります。ファイルの最後にこれらの2行を追加します

var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);

Project/App_Start/WebApiConfig.cs for asp.net MVCにあります

0
zetawars

これを試してください ApiController.Ok

return Ok(model)を実行し、戻り値のタイプを IHttpActionResult に変更するだけです。

例:

public class CarController : ApiController
{
    [System.Web.Mvc.Route("api/Player/videos")]
    public IHttpActionResult GetVideoMappings()
    {
        var model = new MyCarModel();
        return Ok(model);
    }
}
0
Mohammad Ali