看起来ServiceStack不喜欢我使用DateTime属性作为我的请求中的参数。我收到了"不好的请求"消息...例外没有其他有用的细节。内部异常显示HTML代码(截断),只是说"类型定义应以" {"期望序列化类型'errorresponse'..."
开始在我的客户中:
private DateTime _selectedReportDate;
public DateTime SelectedReportDate
{
get { return _selectedReportDate; }
set { SetProperty(ref _selectedReportDate, value); }
}
....
var txResults = await ServiceClient.Instance.GetAsync(new PaymentSummaries()
{
Date = SelectedReportDate
});
服务模型:
[Route("/report/paymentsummaries/{Date}", "GET")]
public class PaymentSummaries : IReturn<List<PaymentSummary>>
{
public DateTime Date { get; set; }
}
服务接口:
[Authenticate]
public class PaymentSummariesService : Service
{
public List<PaymentSummary> Get(PaymentSummaries request)
{
var results = Db.SqlList<Data.OrmLite.SpResponse.ReconcilePaymentSummaryRecord>("EXEC [Report].[ReconcilePaymentsSummary] @date", new { date = request.Date });
return results.ConvertAll(x => x.ConvertTo<PaymentSummary>());
}
}
我会遇到"不良请求"错误。
当我更改时:
Date = SelectedReportDate
to
Date = new DateTime()
在客户端代码中,它确实有效,并出于某种原因键入服务接口代码。
update
这是请求标题:
获取 http://devservicestack:44345/report/paymentmentmaries/2016-11-30t13%3A09%3A15.6795974-05%3A00 http/1.1接受编码:GZIP,DEFLATE ACCEPT:application/json 用户代理:ServiceStack .NET客户端4.54主机:DevServiceStack:44345 cookie:ss-id = f4bt4AmonHyFQCFQMSMR;ss-pid = k6ajma17xw31qivy1z8v; ss-opt = temp
响应标头告诉我:
[httpexception(0x80004005):潜在危险的请求。 从客户端检测到值(:)。]
system.web.httprequest.validateinputifrequiredbyconfig() 9827624
system.web.pipelinestepmanager.validatehelper(httpcontext上下文) 53
在ASP.NET中托管ServiceStack时(与自我托管相对)时,ASP.NET使用XSS安全检查。为了解决这个问题,我可以允许特定字符:
<system.web>
<httpRuntime targetFramework="4.6.2" requestPathInvalidCharacters="<,>,*,%,&,,?" />
</system.web>
(省略":"在RequestPathinvalidcharacter中)
或:
<system.web>
<httpRuntime targetFramework="4.6.2" requestValidationMode="2.0" requestPathInvalidCharacters="" />
</system.web>
禁用整个应用程序的请求验证。