3

キーと値のペアのリストを返すServiceStack (素晴らしい)を使用して、単純な Rest サービスを構築しました。

私のサービスは次のようになります。

 public class ServiceListAll : RestServiceBase<ListAllResponse>
{
    public override object OnGet(ListAllResponse request)
    {          
        APIClient c = VenueServiceHelper.CheckAndGetClient(request.APIKey, VenueServiceHelper.Methods.ListDestinations);

        if (c == null)
        {
            return null;
        }
        else
        {
            if ((RequestContext.AbsoluteUri.Contains("counties")))
            {
                return General.GetListOfCounties();
            }

            else if ((RequestContext.AbsoluteUri.Contains("destinations")))
            {
                return General.GetListOfDestinations();
            }

            else
            {
                return null;
            }
        }
    }
}

私の応答は次のようになります。

    public class ListAllResponse
{
    public string County { get; set; }
    public string Destination { get; set; }
    public string APIKey { get; set; }     
}

残りの URL を次のようにマッピングしました。

.Add<ListAllResponse>("/destinations")
.Add<ListAllResponse>("/counties")

サービスを呼び出すとき

http://localhost:5000/counties/?apikey=xxx&format=xml

次の例外が発生します (サービスの最初の行のブレークポイントにヒットしません)。

NullReferenceException オブジェクト参照がオブジェクトのインスタンスに設定されていません。ServiceStack.Text.XmlSerializer.SerializeToStream(オブジェクト obj、ストリーム ストリーム) で ServiceStack.Common.Web.HttpResponseFilter.<GetStreamSerializer>b_ 3(IRequestContext r、オブジェクト o、ストリーム s) で ServiceStack.Common.Web.HttpResponseFilter.<> c _DisplayClass1.<GetResponseSerializer>b__0(IRequestContext httpReq、オブジェクト dto、IHttpResponse httpRes) ServiceStack.WebHost.Endpoints.Extensions.HttpResponseExtensions.WriteToResponse(IHttpResponse 応答、オブジェクト結果、ResponseSerializerDelegate defaultAction、IRequestContext serializerCtx、Byte[] bodyPrefix、Byte[] bodySuffix)

呼び出しにパラメーターを含めるかどうかに関係なく、例外がスローされます。また、同じプロジェクト内の同じラインに沿って、正常に動作する他の多くのサービスも作成しました。これが何を意味するかについて、誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

7

Web サービスの設計が少し遅れています。リクエスト DTORestServiceBase<TRequest>は、応答ではなく続行する必要があります。また、REST 対応のサービスを作成している場合は、サービスの名前 (Request DTO など) を名詞にすることをお勧めします (この場合は Codes など)。

また、CodesResponse など、'{RequestDto}Response' の規則に従った名前で、同じ厳密に型指定された Response をサービスに使用することをお勧めします。

最後に、null ではなく空の応答を返すため、クライアントは null 応答ではなく空の結果セットのみを処理する必要があります。

サービスを書き直す方法は次のとおりです。

 [RestService("/codes/{Type}")]
 public class Codes {
      public string APIKey { get; set; }     
      public string Type { get; set; }
 }

 public class CodesResponse {
      public CodesResponse() {
           Results = new List<string>();
      }

      public List<string> Results { get; set; }
 }

 public class CodesService : RestServiceBase<Codes>
 {
      public override object OnGet(Codes request)
      {          
           APIClient c = VenueServiceHelper.CheckAndGetClient(request.APIKey, 
              VenueServiceHelper.Methods.ListDestinations);

           var response = new CodesResponse();
           if (c == null) return response;

           if (request.Type == "counties") 
                response.Results = General.GetListOfCounties();
           else if (request.Type == "destinations") 
                response.Results = General.GetListOfDestinations();

           return response; 
     }
 }

[RestService] 属性または次のルート (同じことを行います) のいずれかを使用できます。

Routes.Add<Codes>("/codes/{Type}");

次のようにサービスを呼び出すことができます。

http://localhost:5000/codes/counties?apikey=xxx&format=xml
于 2012-03-08T22:17:38.313 に答える