数据如何发布(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>
.
我有复杂的 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>
.