gpt4 book ai didi

c# - 为什么我的 ServiceStack 服务会抛出异常?

转载 作者:行者123 更新时间:2023-11-30 14:15:37 25 4
gpt4 key购买 nike

我使用 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 Object reference not set to an instance of an object. at ServiceStack.Text.XmlSerializer.SerializeToStream(Object obj, Stream stream) at ServiceStack.Common.Web.HttpResponseFilter.<GetStreamSerializer>b_3(IRequestContext r, Object o, Stream s) at ServiceStack.Common.Web.HttpResponseFilter.<>c_DisplayClass1.<GetResponseSerializer>b__0(IRequestContext httpReq, Object dto, IHttpResponse httpRes) at ServiceStack.WebHost.Endpoints.Extensions.HttpResponseExtensions.WriteToResponse(IHttpResponse response, Object result, ResponseSerializerDelegate defaultAction, IRequestContext serializerCtx, Byte[] bodyPrefix, Byte[] bodySuffix)

无论我是否在调用中包含任何参数,都会抛出异常。我还在同一个项目中按照相同的思路创建了许多其他服务,它们运行良好。谁能指出我正确的方向,这意味着什么?

最佳答案

你的网络服务设计有点落后,你的请求DTO应该继续RestServiceBase<TRequest>不是你的回应。如果你正在创建一个 REST-ful 服务,我建议你的服务的名称(即请求 DTO)是一个名词,例如在这种情况下可能是代码。

此外,我建议为您的服务使用相同的强类型响应,其名称遵循“{RequestDto}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

关于c# - 为什么我的 ServiceStack 服务会抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9617862/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com