#wcf #rest
#wcf #отдых
Вопрос:
Допустим, у нас есть клиент REST со следующим объявлением:
[ServiceContract]
interface ITestClient
{
[OperationContract]
[WebGet(UriTemplate = "SetData/?d1={d1}amp;d2={d2}")]
void SetData(string d1, string d2);
}
Я хотел бы использовать его со следующей подписью (HTTP GET):
[ServiceContract]
interface ITestClient
{
[OperationContract]
[WebGet(UriTemplate = "SetData/?")]
void SetData(SetDataRequest setData);
}
[DataContract]
public class SetDataRequest
{
[DataMember(Name = "d1")]
private string Data1 { get; set; }
[DataMember(Name = "d2")]
private string Data2 { get; set; }
}
Я бы хотел, чтобы WCF сериализовал экземпляр SetDataRequest
строки запроса to HTTP.
Возможно ли это (HTTP POST недопустим)?
Ответ №1:
Вы не должны использовать WebGet для этого, вместо этого вы должны сделать:-
[OperationContract]
[WebInvoke( UriTemplate="SetDate/" Method="POST")]
void SetData(SetDataRequest setData);
Вы должны использовать post при отправке данных, так как в противном случае вы столкнетесь с проблемами безопасности / кэширования.
Комментарии:
1. У меня нет доступа к серверной части сервиса, поэтому я привязан к HTTP GET. HTTP POST в данном случае не является вариантом. Безопасность решается путем привязки к протоколу https.
2. tbh, вероятно, проще иметь вспомогательный объект, который просто сериализует его в строку.
3. о, и безопасность не решается с помощью https, кэширование — это побочный эффект! Люди по-прежнему могут совершать атаки на сервис с целью подделки межсайтовых запросов.