1

オブジェクトを WCF REST Web サービスにポストする際に問題が発生しています。

WCF側には次のものがあります。

[WebInvoke(UriTemplate = "", Method = "POST")]
public void Create(myObject object)
{
//save some stuff to the db
}

デバッグ中はブレークポイントにヒットすることはありませんが、パラメータを削除するとブレークポイントにヒットします。そのため、RestSharp 側で何か問題が発生したと推測しています。

その部分の私のコードは次のとおりです。

var client = new RestClient(ApiBaseUri);
var request = new RestRequest(Method.POST);       

request.RequestFormat = DataFormat.Xml;        

request.AddBody(myObject);

var response = client.Execute(request);

私はこれを間違っていますか?WCF 側はどのように私のオブジェクトを見ることができますか? 依頼はどのような方法で行えばよいですか?それとも、WCF側で別の方法で処理する必要がありますか?

私が試したこと:

request.AddObject(myObject);

request.AddBody(request.XmlSerialise.serialise(myObject));

何が間違っている可能性があるかについての助けと理解をいただければ幸いです。ありがとう。

4

2 に答える 2

3

私は同じ問題に苦しんでいます。渡すオブジェクトを追加しようとすると、「Bad request」になります。見つけたさまざまなサイトに基づいてさまざまなことを試しましたが、何も得られませんでした。次に、形式を Xml から Json に変更したところ、機能し始めました。XMLの受け渡しに問題があるに違いありません。2 台目の PC をセットアップし、wireshark や fiddler などで実際の http を盗聴する必要がある場合があります。(または、jsonに固執するかもしれません)

以下は、私の実験的な WCF インターフェイスの関数です。

    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "manualselect", ResponseFormat = WebMessageFormat.Json)]
    void PostManualSelect(ManualUpdateRequest S);

それから私のテストRestSharpクライアント

            var client = new RestClient();
        client.BaseUrl = "http://127.0.0.1:8000";
        /* Initialization of ManualUpdateRequest instance "DR" here */

        var request = new RestRequest(Method.POST);
        request.Resource = "manualselect";
        request.RequestFormat = DataFormat.Json;
        request.AddBody(DR);
        RestResponse response = client.Execute(request);

おそらく、誰かがこの問題にもう少し光を当てることができます。私は REST サービスも初めてです。より良い答えに導くために、調査結果を追加すると思いました。

( --EDIT-- ) さらに掘り下げて、この一口を見つけた ので、 [XmlSerializerFormat] 属性を ServiceContract インターフェイスに次のように追加しました

[ServiceContract]
[XmlSerializerFormat]
public interface IMyRestService
{
    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "manualselect", ResponseFormat = WebMessageFormat.Xml)]
    void PostManualSelect(ManualUpdateRequest S);
}

そして、これがついに機能し、サービスでオブジェクトを取得しました

            var client = new RestClient();
        client.BaseUrl = "http://127.0.0.1:8000";
        /* Initialization of ManualUpdateRequest instance "DR" here */

        var request = new RestRequest(Method.POST);
        request.Resource = "manualselect";
        request.RequestFormat = DataFormat.Xml;
        request.AddBody(DR);
        RestResponse response = client.Execute(request);

( --EDIT 2-- ) XML シリアライズの奇妙さに遭遇したため、この拡張機能を作成しました (ここから借用)。それでも問題が発生した場合に役立つ可能性があります。ここには、パブリック プロパティを使用して正しくシリアル化する必要があることを意味する回答もありますが、これはまだ試していません。

public static class RestSharpExtensions
{
    public static T GetXmlObject<T>(this IRestResponse response)
    {
        if (string.IsNullOrEmpty(response.Content))
        {
            return default(T);
        }

        XmlSerializer serializer = new XmlSerializer(typeof(T));

        XmlReaderSettings settings = new XmlReaderSettings();
        // No settings need modifying here

        using (StringReader textReader = new StringReader(response.Content))
        {
            using (XmlReader xmlReader = XmlReader.Create(textReader, settings))
            {
                return (T)serializer.Deserialize(xmlReader);
            }
        }
    }

    public static void UseDotNetXml(this IRestRequest request)
    {
        request.RequestFormat = DataFormat.Xml;
        request.XmlSerializer = new RestSharp.Serializers.DotNetXmlSerializer();
    }

}

だから私のRestSharp呼び出しはこのように見え始めます

    public SimpleSignUpdateDataSet GetSimpleDataset()
    {
        var client = new RestClient(SerivceURL);

        var request = new RestRequest("simpledataset", Method.GET);
        request.UseDotNetXml();

        var resp = client.Execute(request);
        return resp.GetXmlObject<SimpleSignUpdateDataSet>();
    }

この回答は長くなりますが、誰かの役に立てば幸いです。

于 2012-04-12T13:02:57.340 に答える
-1

同じPCでフィドラーを使用できます....2番目のPCは必要ありません。インストールすると、これらのタイプの問題を解決するのが非常に簡単になります。

次のようにプロキシを指定します。

using system.net; // for the WebProxy

RestClient rc = new RestClient(aUrl);
rc.Proxy = new WebProxy("http://127.0.0.1:8888");
于 2013-03-25T00:20:07.797 に答える