我正在编写一个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);
...
任何想法,因为我现在有点迷失了!
由于
答案 0 :(得分:0)
URI到服务器方法的映射不正确。根据默认映射,PUT请求将调用AcceptDocument方法,POST请求将调用UpdateDocument方法。
http://docwiki.embarcadero.com/RADStudio/en/REST
同样传递TStream作为参数也有可能遇到困难。你有可能使用JSON吗?我不确定Delphi 2009是否支持JSON。
编辑: 引自Delphi documentation:
默认情况下,“update”的前缀被分配给任何调用的方法 用POST。同样,'cancel'的前缀用于DELETE 请求和'accept'前缀用于PUT请求。这个 通过在方法周围加上引号可以避免前缀 名称
以上引用适用于Delphi。也许也适用于WCF。
答案 1 :(得分:0)
根据我上面的评论,安装Fiddler让我看看webservice输出的实际页面,这有助于拥有示例XML和json结构。我错过了对象的命名空间,所以我猜WCF结束时不知道要翻译什么,将消息更改为以下内容使其工作:
msg := '<?xml version="1.0"?>' +
'<Document xmlns="http://schemas.datacontract.org/2004/07/Contracts.Contracts">' +
'<Id>123456788888</Id>' +
'</Document>';