2

I'm consuming a web-service with ServiceStack. The header expected is:

POST /SeizureWebService/Service.asmx/SeizureAPILogs HTTP/1.1
Host: host.com
Content-Type: application/x-www-form-urlencoded
Content-Length: length

jsonRequest=string

I'm trying to consume it with this code:

public class JsonCustomClient : JsonServiceClient
{
    public override string Format
    {
        get
        {
            return "x-www-form-urlencoded";
        }
    }

    public override void SerializeToStream(ServiceStack.ServiceHost.IRequestContext requestContext, object request, System.IO.Stream stream)
    {
        string message = "jsonRequest=";
        using (StreamWriter sw = new StreamWriter(stream, Encoding.Unicode))
        {
            sw.Write(message);
        }
        // I get an error that the stream is not writable if I use the above
        base.SerializeToStream(requestContext, request, stream);
    }
}

public static void JsonSS(LogsDTO logs)
{    
    using (var client = new JsonCustomClient())
    {
        var response = client.Post<LogsDTOResponse>(URI + "/SeizureAPILogs", logs);
    }
}

I can't figure out how to add the jsonRequest= before the serialized DTO. How do I do this?

Solution based on Mythz's answer:

Added how I used Mythz's answer for someone having the same issue(s) in the future - enjoy!

public static LogsDTOResponse JsonSS(LogsDTO logs)
{
    string url = string.Format("{0}/SeizureAPILogs", URI);
    string json = JsonSerializer.SerializeToString(logs);
    string data = string.Format("jsonRequest={0}", json);
    var response = url.PostToUrl(data, ContentType.FormUrlEncoded, null);
    return response.FromJson<LogsDTOResponse>();
}
4

1 に答える 1

3

これは、データを送信するためのカスタム サービス クライアントの非常に奇妙な使い方ですx-www-form-urlencoded。ServiceStack の ServiceClient は同じコンテンツ タイプを送受信するためのものであるため、これを試すのは少し野心的だと思います。クラスが呼び出されたとしても、プロパティJsonCustomClientをオーバーライドしたため、JSON クライアントではなくなりました。Format

あなたの問題はStreamWriter、基になるストリームを閉じる using ステートメントで を使用している可能性があります。また、回線上で Url-Encoded + JSON content-type の不正な組み合わせが発生するため、基本メソッドの呼び出しはエラーになると思います。

個人的には、ServiceClients を避けて、標準の HTTP クライアントを使用します。たとえば、ServiceStack には、.NET で HTTP 呼び出しを行う際に必要な通常のボイラープレートをラップする WebRequest への拡張機能があります。

var json = "{0}/SeizureAPILogs".Fmt(URI)
           .PostToUrl("jsonRequest=string", ContentType.FormUrlEncoded);

var logsDtoResponse = json.FromJson<LogsDTOResponse>();
于 2012-10-30T22:51:33.830 に答える