0

ASP.NET을 사용하여 WebApi를 구축 중입니다. 이제는 전체 응용 프로그램을 몇 개의 레이어로 나누었으며 그 중 두 개는 "인터페이스"와 "모델"입니다 (레이어마다 하나씩 .dll이 있습니다). "models.dll"에서 모든 모델이 정의되고 응용 프로그램 시작시 필요한 위치에 주입이 시작됩니다. 여태까지는 그런대로 잘됐다. 이제는 내 컨트롤에서 값을 반환 할 때 문제가 발생했습니다. 의는 다음을 가정 해 봅시다 :C# (Web API) 종속성 삽입 (Unity 사용) 반환 유형 인터페이스

public class TestController : ApiController 
{ 
    IBusinessObject _businessObject; 

    public TestController(IBusinessObject businessObject) 
    { 
     this._businessObject= businessObject; 
    } 

    [Route("details/object/{id}")] 
    [HttpGet] 
    public ISomeObject GetObjectByNr(int id) 
    { 
     return this._businessObject.SearchForObject(id); 
    } 
} 

을 이제 GetObjectByNr 볼 때 당신이 그것의 반환 형식이 ISomeObject (this._businessObject.SearchForObject (ID의 물론 반환 형식)도 ISomeObject되는) 것을 볼 수 있습니다. ISomeObject의 실제 구현은 ModelLayer 내부에 있지만 인터페이스를 통해서만 통신하기 때문에 WebApi 프로젝트에 포함하고 싶지 않습니다. 이제 내가 이렇게 실행하면 DataContractResolver (일련 화에 대해)을 사용해야한다고하는 오류가 발생합니다. 나는 인터페이스를 직렬화 할 수 없다는 것을 알고 있지만, 제 응용 프로그램이 여기에 주입 할 올바른 클래스를 찾을만큼 똑똑하다고 생각합니다. (시작시 모든 인터페이스를 해결하면 올바르게 작동합니다. this._businessObject.SearchForObject(id) 올바른 클래스가 호출되고 오른쪽 값으로 채워지지만이 시점에서 개체를 반환 할 때 오류가 발생합니다.) 나는 SO를보고 있었고 예를 들어 KnownType(typeof(SomeObject)) 속성과 같은 "갈 방법"을 발견했다. 하지만 TestController 내부를 설정하려고 할 때 인식되지 않습니다 (하지만 실제로 작동하더라도 내 실제 모델 클래스에 대한 참조가 필요하며이를 원하지 않습니다).

내 인터페이스를 serialize 가능하게 만들고 실제로 ISomeObject 구현이 무엇인지 컨트롤러에 알리지 않고 올바른 개체를 반환 할 수있는 방법이 있습니까?

감사

+0

:

public class JsonNetResult : JsonResult { public JsonSerializerSettings SerializerSettings { get; set; } public Formatting Formatting { get; set; } public JsonNetResult() { Formatting = Formatting.None; SerializerSettings = new JsonSerializerSettings(); JsonRequestBehavior = JsonRequestBehavior.DenyGet; } public override void ExecuteResult(ControllerContext context) { if (context == null) throw new ArgumentNullException("context"); if (JsonRequestBehavior == JsonRequestBehavior.DenyGet && String.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) { throw new InvalidOperationException("This request has been blocked because sensitive information could be disclosed to third party web sites when this is used in a GET request. To allow GET requests, set JsonRequestBehavior to AllowGet."); } HttpResponseBase response = context.HttpContext.Response; response.ContentType = !string.IsNullOrEmpty(ContentType) ? ContentType : "application/json"; if (ContentEncoding != null) response.ContentEncoding = ContentEncoding; if (Data != null) { var writer = new JsonTextWriter(response.Output) { Formatting = Formatting }; var serializer = JsonSerializer.Create(SerializerSettings); serializer.Serialize(writer, Data); writer.Flush(); } } 

그런 다음 컨트롤러 클래스에서 재정의 JSON 방법 :

protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding) { return new JsonNetResult { ContentType = contentType, ContentEncoding = contentEncoding, Data = data }; } protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding, JsonRequestBehavior behavior) { return new JsonNetResult { ContentType = contentType, ContentEncoding = contentEncoding, Data = data, JsonRequestBehavior = behavior }; } 

그리고 다음과 같이 사용하는 가장 편리한 방법은 기본 JSON 결과 동작을 무시하는 것입니다 정확한 에러/예외를 게시하십시오. 인터페이스를 직렬화 할 수없는 본질적인 이유가 없습니다. 얼마나 많은 컨트롤러 액션이'IEnumerable '을 반환하는지 생각하십시오. –

+0

인터페이스는 직렬화 할 수 없습니다. 그것들은 단지 객체가 구현하는 계약 일뿐입니다. –

+0

아마 내가 잘못 말한 것은 사실이지만 구현에 대해 알 필요없이 인터페이스를 구현하는 객체를 직렬화 할 수 있습니다. –

답변

0

편집 :

시도 MediaTypeFormatter 자신을 사용. ie sharpSerializer 또는 Json.NET을 사용할 수 있습니다.

http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters

http://www.asp.net/web-api/overview/advanced/configuring-aspnet-web-api

편집 참고 :이 작업을 수행하는 방법에 정보가 아래 코드는 MVC 컨트롤러,하지 WebAPI ApiController을 목표로하고있다.

DataContractSerializer에 구속되지 않으면 json 직렬화와 같은 다른 기능을 사용할 수 있습니다. 예를 들어 Json.NET을 사용할 수 있습니다. 당신이 할 수

public ActionResult GetObjectByNr(int id) 
{ 
    return Json(this._businessObject.SearchForObject(id), JsonRequestBehavior.AllowGet); 
} 
+0

하지만 클라이언트가 응답으로 xml을 원할 때이 기능이 작동하지 않습니까? – dev01

+0

이 작동하지 않습니다. 심지어 NewtonSoft.JSON을 포함 할 때도 JsonResult는 인식되지 않습니다. – dev01

+0

음, Json은 물론 XML이 아닙니다. XML이 필요한 경우 sharpSerializer (http://www.sharpserializer.com)를 사용할 수 있습니다. –

관련 문제