数据如何发布(POST)到 Servicestack 中的服务,是通过URL吗?

How Data is posted (POST) to Service in Servicestack , is it through URL?

我有复杂的 requstDto,它由其他 DTO(Entity framework 实体)列表组成,例如

[Route("/demoservice/{UserName}/{EmployerID}/{Report}/{selectedDataList}/", "POST")]
        public class ReportDemo : IReturn<String>
        {
            public string UserName { get; set; }
            public int EmployerID { get; set; }
            public UserReport Report { get; set; }
            public List<selectedidList> selectedDataList{ get; set; }            

        } 

UserReport 紧随其后

public class UserReport  
        {
            public string UserName { get; set; }
            public Datetime CreatedON{ get; set; }                       

        } 

当我尝试 post 请求时,出现以下错误

从客户端检测到具有潜在危险的 Request.Path 值 (:)

我认为它给出错误是因为:在 CreatedON 字段中(对于时间部分)。

post 值是否也通过 URL 发送到 ServiceStack URL?如果是

1) 如果我们有非常大且复杂的 requestDTO 导致在 URL 中出现大量字符(大于允许的)怎么办?

2) 如何使上述场景工作,因为“:”是保留的,不能通过 URL 发送?

3) 如何查看客户端生成的请求URL?

我在 MVC.net 中的客户端代码是

var client = new JsonServiceClient(ConfigurationManager.AppSettings["applicationUrl"])
                {
                    //for windows authentication
                    Credentials = CredentialCache.DefaultCredentials      

                };

 var result = client.Post (new ReportDemo 
                 {
                     UserName = userReportViewModel.UserName,
                     EmployerID = userReportViewModel.EmployerID,
                     Report = userReportViewModel.Report,
                     selectedDataList =userReportViewModel.selectedDataList 

                 });

提前致谢, 阿莫尔

只应在[Route]中指定Url的/path/info。理想情况下,路由应该使用人类可读的逻辑结构 Url 来引用 "Resource"(名词)。有关不同示例,请参阅 SeviceStack REST Events Example

路由还应该永远不要包含复杂类型,任何不在 [Route] 上的变量都会自动发送到 POST 的 HTTP 请求正文中请求或 GET 请求中的 QueryString。

对于这样的用户报告,我会选择一个 URL 来标识该报告,如果该报告的名称类似于 "Demo Report",我将使用如下路径信息:

[Route("/reports/demo")] 
public class ReportDemo : IReturn<String> { ... }

否则,如果这是针对用户的报告,您可能希望使用类似以下内容的内容:

[Route("/users/{UserName}/reports/demo")] 
public class ReportDemo : IReturn<String> { ... }

您可以使用 Reverse Routing 扩展方法检查 url 使用了什么,例如:

var request = ReportDemo { UserName = "Foo", ... };

request.ToPostUrl().Print(); //= /users/Foo/reports/demo

现在您可以发送您的请求,其中任何 属性 不在 POST 到上述 url 的路由中,例如:

string result = client.Post (new ReportDemo {
     UserName = userReportViewModel.UserName,
     EmployerID = userReportViewModel.EmployerID,
     Report = userReportViewModel.Report,
     selectedDataList =userReportViewModel.selectedDataList 
 });

如果您的报告 return string 您可以使用 IReturn<string> 但是如果它 return 是一个 Response DTO,您将需要使用它,例如 IReturn<ReportDemoResponse>.