【问题标题】:ServiceStack DateTime Deserialize IssueServiceStack DateTime 反序列化问题
【发布时间】:2016-11-29 20:53:27
【问题描述】:

看起来 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

Date = new DateTime()

在客户端代码中,它确实有效,并且由于某种原因命中了服务接口代码。

更新

这是请求标头:

获取 http://devservicestack:44345/report/paymentsummaries/2016-11-30T13%3A09%3A15.6795974-05%3A00 HTTP/1.1 Accept-Encoding: gzip,deflate Accept: application/json 用户代理:ServiceStack .NET 客户端 4.54 主机:devservicestack:44345 Cookie:ss-id=F4Bt4aMonhyFQcfqmSmR; ss-pid=K6aJMA17Xw31qIVy1z8V; ss-opt=温度

响应头告诉我:

[HttpException (0x80004005): 有潜在危险的 Request.Path 从客户端检测到值 (:)。]
System.Web.HttpRequest.ValidateInputIfRequiredByConfig() +9827624
System.Web.PipelineStepManager.ValidateHelper(HttpContext 上下文) +53

【问题讨论】:

  • 您能创建一个MCVE吗?
  • 您传递给的值是!
  • 如果捕捉到抛出的异常,ErrorMessage 属性是什么?
  • @DustinHodges 在异常中没有任何用处......只是“错误请求”和一个内部异常说它不喜欢响应不是以“{”开头(它返回一个html 代码而不是 json)...一旦我让 Fiddler 工作,就会看到完整的 html 消息
  • 请更新此帖子以包含原始 HTTP 请求/响应标头。如果它返回 HTML 而不是 JSON 响应,它可能是一个 ASP.NET 错误页面,其中包含有关错误的信息。

标签: datetime servicestack


【解决方案1】:

在 ASP.Net 中托管 ServiceStack(与自托管相反)时,ASP.Net 使用 XSS 安全检查。为了解决这个问题,我可以允许特定字符:

  <system.web>
    <httpRuntime targetFramework="4.6.2" requestPathInvalidCharacters="&lt;,>,*,%,&amp;,\,?" />
  </system.web>

(requestPathInvalidCharacters 中省略了“:”)

或:

  <system.web>
    <httpRuntime targetFramework="4.6.2" requestValidationMode="2.0" requestPathInvalidCharacters="" />
  </system.web>

禁用整个应用程序的请求验证。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多