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

ryhaxcpt  于 2023-02-19  发布在  其他
关注(0)|答案(1)|浏览(155)

我有一个复杂的requestDto,它由其他DTO(实体框架实体)列表组成,如

[Route("/demoservice/{Userdemo}/{EmployerDemoid}/{ReportDemo}/{DemoselectedDataList}/", "POST")]
        public class ReportDemo : IReturn<String>
        {
           
            public List<selectedidList> selectedDataList{ get; set; }            
            
        }

其中UserReport跟在后面

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

当我尝试发布请求时,它给我以下错误

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

我认为它给出错误是由于:(对于时间部分)。
发布值是否也通过URL发送到ServiceStack URL?如果是

1)如果我们有非常大且复杂的requestDTO,导致URL中出现大量字符(超过允许的字符数),该怎么办?
2)如何使上述方案的工作,因为“:“是保留的,不能通过URL发送?
3)如何查看从客户端生成的请求URL?

我在www.example.com中的客户代码MVC.net为

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

                };

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

                 });

先谢谢你了阿莫尔

hl0ma9xz

hl0ma9xz1#

[Route]中只应指定URL的/path/info。理想情况下,路由应使用引用“资源”(名词)的可读逻辑结构URL。有关不同示例,请参见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> { ... }

您可以通过使用反向路由扩展方法检查使用的url,例如:

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

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

现在您可以发送您的请求与任何属性不在路线获取POST'艾德到上述网址,例如:

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

如果您的报告确实返回string,则可以使用IReturn<string>,但是如果它返回响应DTO,则需要使用该响应DTO,例如IReturn<ReportDemoResponse>

相关问题