Wcf Delphi Rest客户端与C#Rest服务器对话时出现的问题

Wcf Delphi Rest客户端与C#Rest服务器对话时出现的问题,wcf,delphi,rest,delphi-2009,Wcf,Delphi,Rest,Delphi 2009,我正在编写一个REST WCF服务,并让它用于C#客户端的连接,但在通过Delphi 2009客户端进行连接时遇到问题。我遇到的问题是一个PUT请求,它(目前)如下所示。它需要一个包含文档对象的XML请求 [WebInvoke(UriTemplate = "Document/{id}", Method = "PUT", RequestFormat=WebMessageFormat.Xml)] public void UpdateDocument (string id, Docum

我正在编写一个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);

  ...
。。。
味精:=''+
'' +
'123456788888' +
'';
XMLDocument1.LoadFromXML(msg);
xmlStream:=TMemoryStream.Create;
idHttp1.Request.ContentType:=“应用程序/xml”;
XMLDocument1.SaveToStream(xmlStream);
网址:='http://localhost:50435/service1/Document/12345678';
结果:=idHttp1.Put(url,xmlStream);
显示消息(结果);
...
任何想法,因为我现在有点迷路了


感谢

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

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

编辑: 引用德尔福的话:

默认情况下,“update”前缀被分配给任何调用的方法 用邮递。同样,“取消”前缀用于删除 请求,并且“接受”前缀用于PUT请求。这 可以通过在方法周围加引号来避免前缀 名字


以上引用适用于德尔福。可能也适用于WCF。

根据我上面的评论,安装Fiddler让我看到了Web服务输出的实际页面,这有助于创建示例XML和json结构。我缺少对象的名称空间,因此我猜WCF端不知道要翻译什么,将消息更改为以下内容使其正常工作:

msg := '<?xml version="1.0"?>' +
'<Document xmlns="http://schemas.datacontract.org/2004/07/Contracts.Contracts">' +
'<Id>123456788888</Id>' +
'</Document>';
msg:=''+
'' +
'123456788888' +
'';

您可以使用类似Fiddler的HTTP代理来捕获工作和非工作请求,然后比较它们安装Fiddler Help,但这只是因为我无法让它工作,所以我查看了服务创建的页面,并且答对了-我需要名称空间来工作。docwiki页面用于DataSnap。问题中的代码使用了一个简单的Indy IdHTTP组件,URL由WCF端提供,不幸的是D2010中没有DataSnap.JSON支持。这也是“原始”连接,不使用DataSnap。URI到服务器方法的映射发生在服务器端。服务器是WCF服务,我假设在那里使用默认映射,如docwiki页面中所述。我不太熟悉WCF,但我假设在默认情况下DelphiREST服务器提供与WCF服务相同的映射协议。无论如何,可能不要依赖URI到服务器方法的自动映射,而是指定准确的url。并尝试将参数作为字符串而不是TStream传递。希望有帮助。我的2美分,不是规格这很好地说明了这一点,不是规格(“样式”没有标准化)