現在、私のApiController
sは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;
応答を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);
}
呼び出し元が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構成とシリアル化を維持できます。
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;
}
}
}
}
たぶん問題は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にあります
これを試してください 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);
}
}