WCF Rest更改根返回元素的名称

时间:2013-04-16 19:09:18

标签: c# .net xml wcf rest

我有

[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>

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

2 个答案:

答案 0 :(得分:0)

你成为你所定义的。您已定义为以XML格式接收空GUID,并返回XML中的空GUID。一切都是对的。

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

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

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

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

答案 1 :(得分:0)

最简单的解决方案是

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

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