2013-09-27 3 views
1

Я запрашиваю службу ServiceStack, с которой мне недавно приходилось сталкиваться, чтобы заставить действие POST работать, и теперь, когда я вызываю действие GET, объект JSON больше не передается, и для жизни меня я не могу понять, что я сделал, чтобы разбить его ...ServiceStack GET action получает нулевой объект

Вот мои заголовки запроса:

Request Url: http://internalserver:8181/citations 
Request Method: GET 
Status Code: 200 
Params: {} 

Вот мой Configure в Global:

public override void Configure(Container container) 
    { 
     container.RegisterAutoWired<CitationRequest>(); 
     container.RegisterAutoWired<Citation>(); 

     //Not sure I need these usings...? 
     using (var addCitation = container.Resolve<CitationService>()) 
     { 
      addCitation.Post(container.Resolve<CitationRequest>()); 
      addCitation.Get(container.Resolve<CitationRequest>()); 
      addCitation.Delete(container.Resolve<CitationRequest>()); 
     } 

     Plugins.Add(new CorsFeature()); 
     RequestFilters.Add((httpReq, httpRes, requestDto) => 
     { 
      if (httpReq.HttpMethod == "OPTIONS") 
       httpRes.EndRequestWithNoContent(); // extension method      
     }); 

     SetConfig(new EndpointHostConfig 
     { 
      DefaultContentType = ContentType.Json, 
      ReturnsInnerException = true, 
      DebugMode = true, 
      AllowJsonpRequests = true, 
      ServiceName = "SSD Citations Web Service", 
      WsdlServiceNamespace = "http://www.servicestack.net/types", 
      WriteErrorsToResponse = true 
     }); 
    } 

Вот мой S е р в:

[Route("/citations/{ReportNumber}/{ReportNumber_Prefix}/{AgencyId}", "GET, DELETE, OPTIONS")] 
[Route("/citations", "GET, POST, DELETE, OPTIONS")] 
public class CitationRequest : IReturn<CitationResponse> 
{ 
    public string ReportNumber { get; set; } 
    public int ReportNumber_Prefix { get; set; } 
    public string AgencyId { get; set; } 
    public DateTime ViolationDateTime { get; set; } 
    public CitationStatus Status { get; set; } 
} 
public class CitationResponse 
{ 
    public bool Accepted { get; set; } 
    public string ActivityId { get; set; } 
    public int ParticipantId { get; set; } 
    public string Message { get; set; } 
    public Exception RmsException { get; set; } 
} 
public class CitationService : Service 
{ 
    public Repository Repository { get { return new Repository(); } } 
    public CitationResponse Get(Citation citation) 
    { 
     var isDuplicate = Repository.IsDuplicateReportNumber(citation.AgencyId, citation.ReportNumber, citation.ReportNumber_Prefix); 
     var citationResponse = new CitationResponse 
      { 
       Accepted = isDuplicate, 
       Message = isDuplicate ? "Report Number already exists in db." : "Report Number has not yet been used." 
      }; 
     return citationResponse; 
    } 

    public CitationResponse Post(CitationRequest request) 
    { 
     var response = new CitationResponse { Accepted = false }; 
     if (string.IsNullOrEmpty(request.ReportNumber)) 
     { 
      response.Accepted = false; 
      response.Message = "No data sent to service. Please enter data in first."; 
      return response; 
     } 
     try 
     { 
      response.ActivityId = Repository.CreateCitation(request.ReportNumber,  request.ReportNumber_Prefix, request.ViolationDateTime, request.AgencyId, request.Status); 
      response.Accepted = true; 
     } 
     catch (Exception ex) 
     { 
      response.Accepted = false; 
      response.Message = ex.Message; 
     } 
     return response; 
    } 

    public CitationResponse Delete(CitationRequest citation) 
    { 
     var citationResponse = new CitationResponse(); 
     try 
     { 
      if (Repository.DeleteCitation(citation.ReportNumber, citation.AgencyId, citation.ReportNumber_Prefix)) 
      { 
       citationResponse.Accepted = true; 
       citationResponse.Message = "Citation removed from db successfully."; 
      } 
      else 
      { 
       citationResponse.Accepted = false; 
       citationResponse.Message = "Citation NOT deleted."; 
      } 
     } 
     catch (Exception ex) 
     { 
      citationResponse.Accepted = false; 
      citationResponse.Message = ex.Message; 
      citationResponse.RmsException = new Exception(ex.Message); 
      throw; 
     } 

     return citationResponse;    
    } 
} 

Мой метод POST полностью заселена с объектом JSON я прохожу к нему, все значения там и годным к употреблению. Тот же EXACT-объект в моем действии GET имеет нулевые значения для всех свойств. Вот полезная нагрузка образца:

{"ReportNumber":"TEST275455", 
"ReportNumber_Prefix":"2013", 
"AgencyId":"BBC", 
"Status":"COMP", 
"ViolationDateTime":"9-21-2013 12:00:00"} 

Я в тупике, и потянув меня за волосы, пытаясь выяснить, почему Get отличается от сообщения ?? Ваша помощь ВОЗМОЖНО!

ответ

2

Вы добавили маршрутизации информации в DTO CitationRequest Запрос:

[Route("/citations/{ReportNumber}/{ReportNumber_Prefix}/{AgencyId}", "GET, DELETE, OPTIONS")] 
[Route("/citations", "GET, POST, DELETE, OPTIONS")] 
public class CitationRequest : IReturn<CitationResponse> 

Предложив это доступно по Get, но вы реализация ожидает Citation вместо этого?

public CitationResponse Get(Citation citation) 

Декларация почты использует правильные один:

public CitationResponse Post(CitationRequest request) 
+0

Благодаря mythz, я установил этот вопрос, но мой объект JSON еще пустой, когда он входит в Get действие. Кроме того, мое действие DELETE теперь возвращает 405 метод не разрешен ... ?? Когда я смотрю заголовки для DELETE, допустимые глаголы не включают DELETE, но я поместил их по всему коду, везде я помещаю другие глаголы, так как он не может включить его в ответ? Чем больше я пытаюсь это исправить, тем хуже получается ... – Eddie

+0

@Eddie См. Этот ответ для проблемы [405 DELETE] (http://stackoverflow.com/a/10283694/85785). Запрос DTO никогда не должен быть «нулевым», но на основе ваших заголовков запросов он должен быть ** пустым **, так как вы не заполняете какие-либо свойства запроса DTO в QueryString или в соответствующем PathInfo. – mythz

+0

Спасибо за информацию о 405 DELETE - я попробую ввести web.config. Не знаю, как реализовать изменение IIS, так как нет расширения файла для ServiceStack ... Кроме того, DELETE работал в течение пары недель, прежде чем я сделал что-то, чтобы испортить его сегодня. Что касается запроса DTO, да, ваше право, это не пустое, но оно пустое. Но если я вызываю службу в '/ citations' и передаю этот объект JSON в полезной нагрузке выше, не следует ли заполнять значение CitationRequest значениями? Вот как это работает для POST и используется для работы с DELETE - почему бы не использовать GET? – Eddie

Смежные вопросы