2015-07-14 2 views
0

У меня есть сложный requstDto, который состоит из другого списка DTO (в Entity Framework Entities) какКак данные отправляются (POST) на службу в Servicestack, через URL?

[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-адрес URL ServiceStack? если да

1) что делать, если у нас очень большой и сложный запросDTO, что приводит к большому количеству символов (больше, чем разрешено) в 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 

       }); 

Спасибо заранее, Amol

ответ

2

Только /path/info из Url должен быть указан в [Route]. В идеале маршруты должны использовать удобочитаемый логически структурированный Url, который ссылается на «Resource» (существительное). См. SeviceStack REST Events Example для разных примеров.

Маршруты должны также никогда включают сложные типы и любую переменную, которая не на [Route] автоматически отправляется в HTTP запроса органа для POST запросов или QueryString от GET запросов.

Для пользователя отчета, как это я бы выбрал URL, который идентифицирует отчет, если отчет имеет название как «Demo Report» Я хотел бы использовать данные путь:

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

В противном случае, если это отчет для пользователей, вы можете вместо этого хотите использовать что-то вроде:

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

вы можете проверить, что URL используется с помощью Reverse Routing методов расширения, например:

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

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

Теперь вы можете отправить свой запрос с любым имуществом, не находящимся в Маршруте, получающем POST'ed к вышеуказанному URL-адресу, например.г:

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

Если ваш отчет действительно возвращают string вы можете использовать IReturn<string> однако, если он возвращает DTO Response вы хотите использовать, что вместо того, чтобы, например IReturn<ReportDemoResponse>.