Я запрашиваю службу 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 отличается от сообщения ?? Ваша помощь ВОЗМОЖНО!
Благодаря mythz, я установил этот вопрос, но мой объект JSON еще пустой, когда он входит в Get действие. Кроме того, мое действие DELETE теперь возвращает 405 метод не разрешен ... ?? Когда я смотрю заголовки для DELETE, допустимые глаголы не включают DELETE, но я поместил их по всему коду, везде я помещаю другие глаголы, так как он не может включить его в ответ? Чем больше я пытаюсь это исправить, тем хуже получается ... – Eddie
@Eddie См. Этот ответ для проблемы [405 DELETE] (http://stackoverflow.com/a/10283694/85785). Запрос DTO никогда не должен быть «нулевым», но на основе ваших заголовков запросов он должен быть ** пустым **, так как вы не заполняете какие-либо свойства запроса DTO в QueryString или в соответствующем PathInfo. – mythz
Спасибо за информацию о 405 DELETE - я попробую ввести web.config. Не знаю, как реализовать изменение IIS, так как нет расширения файла для ServiceStack ... Кроме того, DELETE работал в течение пары недель, прежде чем я сделал что-то, чтобы испортить его сегодня. Что касается запроса DTO, да, ваше право, это не пустое, но оно пустое. Но если я вызываю службу в '/ citations' и передаю этот объект JSON в полезной нагрузке выше, не следует ли заполнять значение CitationRequest значениями? Вот как это работает для POST и используется для работы с DELETE - почему бы не использовать GET? – Eddie