WebGet и объект в качестве параметра GET в WCF REST client

#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, кэширование — это побочный эффект! Люди по-прежнему могут совершать атаки на сервис с целью подделки межсайтовых запросов.