我们将C#Web服务从ServiceStack V4.0.31升级到了V5.1.0。我们在具有monodevelop运行时的Linux环境中使用以下软件包。
<package id="ServiceStack" version="5.1.0" targetFramework="net45" />
<package id="ServiceStack.Client" version="5.1.0" targetFramework="net45" />
<package id="ServiceStack.Common" version="5.1.0" targetFramework="net45" />
<package id="ServiceStack.Interfaces" version="5.1.0" targetFramework="net45" />
<package id="ServiceStack.Redis" version="5.1.0" targetFramework="net45" />
<package id="ServiceStack.Text" version="5.1.0" targetFramework="net45" />
升级后,我们现在在处理某些客户要求时遇到问题。我们的请求DTO包含几条路线,但以下一条总是失败。
[FallbackRoute("/{Path*}")]
public class S3Request : IRequiresRequestStream {
public Stream RequestStream { get; set; }
}
客户端发出
时将调用此路由GET http://endpoint:1310/name/clients/C1/sites/G1
(端口和路由无关紧要,仅是示例)。我们收到一个包含以下错误响应的400错误请求。
{
"ResponseStatus": {
"ErrorCode": "ArgumentException",
"Message": "Could not find property Path on S3Request",
"StackTrace": " at ServiceStack.Host.RestPath.CreateRequest (System.String pathInfo, System.Collections.Generic.Dictionary`2[TKey,TValue] queryStringAndFormData, System.Object fromInstance) [0x000c9] in <629ec152372546cf812fe4a698c7a784>:0 \n at ServiceStack.Host.RestHandler.CreateRequest (ServiceStack.Web.IRequest httpReq, ServiceStack.Web.IRestPath restPath, System.Collections.Generic.Dictionary`2[TKey,TValue] requestParams, System.Object requestDto) [0x0001e] in <629ec152372546cf812fe4a698c7a784>:0 \n at ServiceStack.Host.ServiceController+<>c__DisplayClass26_0.<RegisterService>b__0 (ServiceStack.Web.IRequest req) [0x00035] in <629ec152372546cf812fe4a698c7a784>:0 \n at ServiceStack.Host.Handlers.ServiceStackHandlerBase.GetCustomRequestFromBinder (ServiceStack.Web.IRequest httpReq, System.Type requestType) [0x00018] in <629ec152372546cf812fe4a698c7a784>:0 \n at ServiceStack.Host.RestHandler.CreateRequestAsync (ServiceStack.Web.IRequest httpReq, ServiceStack.Web.IRestPath restPath) [0x00017] in <629ec152372546cf812fe4a698c7a784>:0 \n at ServiceStack.Host.RestHandler+<ProcessRequestAsync>d__14.MoveNext () [0x00125] in <629ec152372546cf812fe4a698c7a784>:0 "
}
}
在代码的以下区域中引发了方法ServiceStack.Host.RestPath.CreateRequest(…)的异常
for (int i = 0; i < this.TotalComponentsCount; i++) {
string text = this.variablesNames [i];
string key;
if (text == null) {
num++;
} else if (!this.propertyNamesMap.TryGetValue (text.ToLower (), out key)) {
if (!StringExtensions.EqualsIgnoreCase (Keywords.Ignore, text)) {
throw new ArgumentException ("Could not find property " + text + " on " + UrlExtensions.GetOperationName (this.RequestType));
}
看来,CreateRequest方法希望propertyNamesMap包含该路线的条目,但该条目不存在。我们想知道V5.1.0 API是否要求我们执行某种在V4.0.31中不需要的路径注册逻辑吗?
答案 0 :(得分:2)
您的DTO缺少了请求DTO上的Path
属性,除了{ignore}
之外,路由上的每个变量都需要匹配请求DTO上的属性。