1

私は REST WCF サービスを作成しており、C# クライアントからの接続で機能していますが、Delphi 2009 クライアント経由での接続に問題があります。私が抱えている問題は、特に PUT リクエストにあり、(現時点では) 以下のように見えます。ドキュメントのオブジェクトを含む XML リクエストが必要です。

    [WebInvoke(UriTemplate = "Document/{id}", Method = "PUT", RequestFormat=WebMessageFormat.Xml)]
    public void UpdateDocument (string id, Document document)
    {
        Document doc = document;

        // this should update or something!
        Console.WriteLine(doc.Id);
    }

Delphi クライアント経由でこれを呼び出そうとすると (以下に示すように)、「Bad Request」が表示されます。奇妙なことに、空のドキュメントを送信すると、リクエストは受信されますが、明らかにデータがありません。

   ...

     msg := '<?xml version="1.0"?>' +
    '<Document>' +
    '<Id>123456788888</Id>' +
    '</Document>';

  XMLDocument1.LoadFromXML(msg);
  xmlStream := TMemoryStream.Create;
  idHttp1.Request.ContentType := 'application/xml';
  XMLDocument1.SaveToStream(xmlStream);
  url := 'http://localhost:50435/service1/Document/12345678';
  result := idHttp1.Put(url, xmlStream);
  ShowMessage (result);

  ...

私は今少し迷っているので、どんなアイデアでも!

ありがとう

4

2 に答える 2

0

上記の私のコメントによると、Fiddler をインストールすると、Web サービスが出力する実際のページが表示されます。これには、XML および json 構造の例が含まれているため便利です。オブジェクトの名前空間が欠落していたので、WCF 側で何を翻訳すればよいかわからなかったので、メッセージを次のように変更するとうまくいきました。

msg := '<?xml version="1.0"?>' +
'<Document xmlns="http://schemas.datacontract.org/2004/07/Contracts.Contracts">' +
'<Id>123456788888</Id>' +
'</Document>';
于 2012-08-13T07:25:09.940 に答える
0

URI からサーバー メソッドへのマッピングが正しくありません。デフォルトのマッピングに従って、PUT リクエストは AcceptDocument メソッドを呼び出し、POST リクエストは UpdateDocument メソッドを呼び出します。

http://docwiki.embarcadero.com/RADStudio/en/REST

また、パラメータとして TStream を渡すことも、問題が発生する可能性があります。JSONを使用することは可能ですか? ただし、Delphi 2009 が JSON をサポートしているかどうかはわかりません。

編集:Delphiのドキュメントからの引用:

デフォルトでは、POST で呼び出されるすべてのメソッドに「update」というプレフィックスが割り当てられます。同様に、「cancel」のプレフィックスは DELETE リクエストに使用され、「accept」のプレフィックスは PUT リクエストに使用されます。この接頭辞は、メソッド名を引用符で囲むことで回避できます

上記の引用は Delphi に適用されます。多分WCFにも。

于 2012-08-03T11:42:20.157 に答える