1

POST アクションを機能させるために最近いじくり回さなければならなかった ServiceStack サービスにクエリを実行していますが、GET アクションを呼び出すと、JSON オブジェクトが渡されなくなり、私の人生ではできません。それを壊すために私が何をしたかを理解してください...

これが私のリクエストヘッダーです:

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

グローバルでの構成は次のとおりです。

    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
        });
    }

これが私のサービスです:

[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 オブジェクトが完全に取り込まれ、すべての値がそこにあり、使用可能です。GET アクションの同じ EXACT オブジェクトのすべてのプロパティに null 値があります。ペイロードの例を次に示します。

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

私は困惑しており、Get が Post と異なる理由を理解しようとして髪を引っ張っていますか?? あなたの助けは大歓迎です!

4

1 に答える 1

2

CitationRequestRequest DTOにルーティング情報を追加しました。

[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)

Post の宣言は正しいものを使用します:

public CitationResponse Post(CitationRequest request)
于 2013-09-27T19:19:39.790 に答える