0
votes

I would like to send a string (JSON formatted) to my webservice instead using a DTO.

var client = new JsonServiceClient(absoluteUrl);
client.Post<T>(absoluteUrl, data); 

But, after to do change my data (DTO object) to a JSON string, I'm getting a ServiceStack Exception: Internal Server Error. Looks like the ServiceStack Post/Send method changes my JSON request.

Is it possible or is there any way to avoid it? Someone else had the same issue?

UPDATE 1: I'm using this approach because of the OAuth authentication. I'm generating a HMAC by request.

Thanks.

1

1 Answers

0
votes

You can use HTTP Utils to send raw JSON, e.g:

var response = absoluteUrl.PostJsonToUrl(data)
    .FromJson<T>();

ServiceStack's .NET Service Clients provide Typed API's to send Typed Request DTO's, it's not meant for POST'ing raw strings but I've just added support for sending raw string, byte[] and Stream in this commit so now you can send raw data with:

var requestPath = request.ToPostUrl();

string json = request.ToJson();
var response = client.Post<GetCustomerResponse>(requestPath, json);

byte[] bytes = json.ToUtf8Bytes();
response = client.Post<GetCustomerResponse>(requestPath, bytes);

Stream ms = new MemoryStream(bytes);
response = client.Post<GetCustomerResponse>(requestPath, ms);

This change is available from v4.0.43+ that's now available on MyGet.

Sharing Cookies with HttpWebRequest

To have different HttpWebRequests share the same "Session" you just need to share the clients Cookies, e.g. after authenticating with a JsonServiceClient you can share the cookies with HTTP Utils by assigning it's CookieContainer, e.g:

var response = absoluteUrl.PostJsonToUrl(data,
     requestFilter: req => req.CookieContainer = client.CookieContainer)
    .FromJson<T>();