2014-11-06 2 views
1

.Net WebApi 2.2에서 bitbucket의 게시물을 수락하려고합니다. 그러나 BB는 데이터를 본문으로 게시하지 않고 게시 매개 변수로 게시합니다. 이 http://www.posttestserver.com/data/2014/11/05/shea/22.05.091712543622Bitbucket POST 후크 .Net ApiController 설정?

현재 우편 배달부 수집 가져올 수 있습니다 : 여기 우체부를 사용하여 보내는의 bitbucket 시뮬레이션 한

내 ApiController에 게시 할 때 https://www.getpostman.com/collections/ec562c5141d85fe7b850

를, 내가 얻을

{ 
    "Message": "The requested resource does not support http method 'POST'." 
} 

게시물 기능 서명이 다음과 같이 표시 될 때 발생합니다.

public string Post([FromUri]string payload) 
{ 
    var hookEvent = JsonConvert.DeserializeObject<HookEvent>(payload); 
    .... 

또는 public string Post (문자열 페이로드) { var hookEvent = JsonConvert.DeserializeObject (payload); ....

내가 할 경우 :

public string Post([FromUri]HookEvent payload) 
{ 
    .... 

페이로드가 null는 아니고, 그러나 모든 필드가 null입니다.

public string Post(HookEvent payload) 
    { 

이 오류가 있습니다 : 나는 변화의 우편 배달부 요청 본문으로 페이로드를 전송하는 경우 때문에 내 'HookEvent이'제대로 역 직렬화 알고

"Message": "The request contains an entity body but no Content-Type header. The inferred media type 'application/octet-stream' is not supported for this resource.", 
"ExceptionMessage": "No MediaTypeFormatter is available to read an object of type 'HookEvent' from content with media type 'application/octet-stream'.", 
"ExceptionType": "System.Net.Http.UnsupportedMediaTypeException", 
"StackTrace": " at System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent content, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)\r\n at System.Net.Http.HttpContentExtensions.ReadAsAsync(HttpContent content, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)\r\n at System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage request, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)" 

를, 개체가 올바르게 모든 필드와, 역 직렬화 세트. 불행히도 BB는 그런 식으로 페이로드를 보내지 않고 게시 된 매개 변수로 보냅니다.

내 컨트롤러 서명은 다음과 같습니다

public class BitbucketHookController : ApiController 
{ 
    .... 

다른 라우팅 비트 :

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
     routes.MapMvcAttributeRoutes(); 
    } 
} 

그리고 위해 Application_Start() Global.asax.cs에서 내가해야 할 일을

 DiConfig.Register(); 
     AreaRegistration.RegisterAllAreas(); 
     GlobalConfiguration.Configure(WebApiConfig.Register); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 

컨트롤러가 게시물 페이로드를 받아들이게하려면 어떻게해야합니까?

+0

사상 1은 메소드 게시물을 반환하지 않는 첫 번째 메소드에서'[HttpPost]'속성으로 꾸밀 수 있습니까? 게시물을 집어 올리도록 강요 할 수 없습니다. – Prescott

+0

생각 2는 모델에 null 값이있는 메서드에서 - 전달되는 요청을 검사하여 전달되는 내용과 방법을 확인할 수 있습니다. 'var req = Request.Content.ReadAsByteArrayAsync()'와 같은 원시 요청에 접근 할 수있다. – Prescott

+0

생각하기 1 : 장식을 추가해도 결과가 바뀌지 않는다. 나는 여전히 요청한 리소스가 http 메소드를 지원하지 않는다. 'POST '. – sheamus

답변

0

파일을 만들 수 있었던 가장 좋은 해결책은 컨테이너 모델을 사용하는 것이 었습니다.

// POST api/<controller> 
    // 
    public string Post(HookEventContainer eventData) 
    { 
     var hookEvent = eventData.HookEvent; 

미운하지만 작동합니다

public class HookEventContainer 
{ 
    public string payload { get; set; } 
    public HookEvent HookEvent { 
     get 
     { 
      if (string.IsNullOrEmpty(payload)) 
      { 
       return null; 
      } 
      return JsonConvert.DeserializeObject<HookEvent>(payload); 
     } 
    } 
} 

그럼 내 포스트 서명이를 사용합니다.

Bitbucket에 요청 본문 대신 매개 변수로 페이로드를 보내는 이유를 알아 내기 위해 Bitbucket에 요청을 보냈습니다. Atlassian이 그것들을 사들 였기 때문에 그들은 모두 반응하지는 않습니다 ....