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

时间:2015-07-14 11:15:15

标签: asp.net-mvc web-services servicestack

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

[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; }                       

        } 

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

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

我认为它会导致错误:在CreatedON字段中(对于时间部分)。

帖子值是否也通过URL发送到ServiceStack URL?如果是的话

1)如果我们有非常大且复杂的requestDTO会导致URL中包含大量字符(大于允许值),该怎么办?

2)如何使上述场景工作为&#34;:&#34;是保留的,不能通过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 

                 });

提前致谢, AMOL

1 个答案:

答案 0 :(得分:2)

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

路由还应从不包含复杂类型,并且[Route]中不存在的任何变量会自动发送到POST请求的HTTP请求正文或来自的{Query} GET请求。

对于像这样的用户报告,我会选择一个标识报告的URL,如果报告的名称类似于“演示报告”,我会使用路径信息,如:

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

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

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

您可以使用Reverse Routing扩展方法检查使用的网址,例如:

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 
 });

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