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 客户端调用它时(如下所示),我收到一个“错误请求”。奇怪的是,如果我发送一个空文档,请求被接收,但显然没有数据。

   ...

     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

URI 到服务器方法的映射不正确。根据默认映射,PUT 请求将调用 AcceptDocument 方法,而 POST 请求将调用 UpdateDocument 方法。

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

将 TStream 作为参数传递也可能会遇到困难。您可以使用 JSON 吗?我不确定 Delphi 2009 是否支持 JSON。

编辑:来自 Delphi文档的引用:

默认情况下,“更新”前缀分配给任何使用 POST 调用的方法。类似地,'cancel' 前缀用于 DELETE 请求,'accept' 前缀用于 PUT 请求。可以通过在方法名称周围加上引号来避免这种前缀

以上报价适用于德尔福。也许也适用于 WCF。

于 2012-08-03T11:42:20.157 回答
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 回答