1

我有

[OperationContract]
[WebInvoke(Method = "POST",
    ResponseFormat = WebMessageFormat.Xml,
    RequestFormat = WebMessageFormat.Xml,
    BodyStyle = WebMessageBodyStyle.Bare,
    UriTemplate = "projects/{projectname}")]
[return: MessageParameter(Name = "ProjectId")]
Guid CreateProject(String projectName);

但这仍然返回

<guid 
xmlns="http://schemas.microsoft.com/2003/10/Serialization/">00000000-0000-0000-0000-00000000</guid>

如何用 ProjectId 替换“guid”?

public Guid CreateProject(String projectName)
{
     return Guid.Empty;
}

如果我将 OperationContract BodyStyle 更改为WrappedResponse我得到:

<CreateProjectResponse 
    xmlns="http://tempuri.org/">
    <ProjectId>00000000-0000-0000-0000-000000000</ProjectId>
</CreateProjectResponse>

这几乎是我想要的,但我不想不必要地包装。

4

2 回答 2

0

最简单的解决方案是

return new XElement("ProjectId", Guid.Empty);

不是我想要的,但它确实有效。

于 2013-04-17T20:04:15.547 回答
0

你成为你所定义的。您已定义以 XML 形式接收空 GUID,并以 XML 形式返回空 GUID。一切正常。

也许您需要将 GUID 转换为某种字符串 id,然后Guid.NewGuid().ToString("N")

当您不期望 xml 时,您需要调整属性并使用来自客户端的 HTTP Accept Header,例如 Json Accept:application/json或字符串 -plain/text

UPD: 现在有点清楚了。您实际上问如何更改 XML 结构。对于标准类型,我建议您使用标准 XML 结构,因为您已经从 box XML 格式化程序中实现了。无论如何,当您需要更改格式化程序时,您可以通过扩展WebHttpBehavior并覆盖该WebHttpBehavior.GetReplyDispatchFormatter方法来返回我们自己的 System.ServiceModel.Dispatcher.IDispatchFormatter 自定义实现(如示例阅读here

我还想提一下,您正在使用 WCF 4 REST,而且这项技术是遗留的。当您不处理遗留项目或维护时,我建议您使用ASP.NET Web API,因为这和许多其他事情可以在那里更容易地完成。

于 2013-04-17T13:03:11.433 回答