tfs - 如何使用 XML 命名空间让 ServiceStack 接收来自 TFS 的 XML 请求

标签 tfs servicestack xml-namespaces

我正在尝试将 TFS 2012 事件通知连接到 ServiceStack,但我一直收到错误消息:

{
    "responseStatus": {
        "errorCode": "RequestBindingException",
        "message": "Unable to bind request",
        "stackTrace": "at ServiceStack.WebHost.Endpoints.RestHandler.GetRequest(IHttpRequest httpReq, IRestPath restPath)\r\n   
                       at ServiceStack.WebHost.Endpoints.RestHandler.ProcessRequest (IHttpRequest httpReq, IHttpResponse httpRes, String operationName)"
    }
}

这是我的 DTO(它包含一些我试图使其工作的位)。
[Route("/releasemanagement/tfsevents/buildcomplete", "POST")]
[DataContract(Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
public class TfsEventBuildComplete : IReturn<BuildCompleteResponse>
{
    [DataMember]
    public string BuildUri { get; set; }

    [DataMember]
    public string TeamFoundationServerUrl { get; set; }

    [DataMember]
    public string TeamProject { get; set; }

    [DataMember]
    public string Title { get; set; }

    [DataMember]
    public string Id { get; set; }

    [DataMember]
    public TfsEventStatusChange StatusChange { get; set; }

    [DataMember]
    public string ChangedBy { get; set; }
}

public class TfsEventStatusChange
{
    public string FieldName { get; set; }

    public string NewValue { get; set; }
}

这是来自 TFS 的 XML:
<BuildStatusChangeEvent xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <BuildUri>vstfs:///Build/Build/4799</BuildUri>
    <TeamFoundationServerUrl>http://TFSURL:8080/tfs/collection</TeamFoundationServerUrl>
    <TeamProject>iSAMS</TeamProject>
    <Title>iSAMS Build Release_20130814.1 Quality Changed To Publish</Title>
    <Subscriber>[02]\Project Collection Service Accounts</Subscriber>
    <Id>Release_20130814.1</Id>
    <Url>http://TFSURL:8080/tfs/web/build.aspx?pcguid=GUID&amp;builduri=vstfs:///Build/Build/4799</Url>
    <TimeZone>GMT Daylight Time</TimeZone>
    <TimeZoneOffset>+01:00:00</TimeZoneOffset>
    <ChangedTime>8/14/2013 9:33:30 AM</ChangedTime>
    <StatusChange>
        <FieldName>Quality</FieldName>
        <NewValue>Publish</NewValue>
    </StatusChange>
    <ChangedBy>DOMAIN\USER</ChangedBy>
</BuildStatusChangeEvent>

我认为 ServiceStack 由于命名空间而实际上无法反序列化请求,但我无法弄清楚。

我尝试过的大部分内容都来自这里:

XML deserializing only works with namespace in xml

最佳答案

这是我为使示例请求 XML 工作所做的工作:

  • 设置 Name您的属性(property)DataContract归因于 BuildStatusChangeEvent .这控制了顶级 XML 元素的预期名称。否则 ServiceStack 将期望 XML 看起来像 <TfsEventBuildComplete><BuildUri>...
  • 设置 Namespace您的属性(property)DataContract属性为空字符串,这样就没有特定的 xmlns请求中需要属性
  • 设置 Order您的属性(property)DataMember属性来指定 XML 元素在从 TFS 获取的 XML 中的排序顺序。默认情况下,XML 序列化程序将期望对元素进行排序 alphabetically ,因此您必须覆盖此内容,否则您的属性的某些部分将无法正确反序列化

  • [Route("/releasemanagement/tfsevents/buildcomplete", "POST")]
    [DataContract(Namespace = "", Name = "BuildStatusChangeEvent")]
    public class TfsEventBuildComplete : IReturn<BuildCompleteResponse>
    {
        [DataMember(Order=1)]
        public string BuildUri { get; set; }
    
        [DataMember(Order=2)]
        public string TeamFoundationServerUrl { get; set; }
    
        [DataMember(Order=3)]
        public string TeamProject { get; set; }
    
        [DataMember(Order=4)]
        public string Title { get; set; }
    
        [DataMember(Order=5)]
        public string Id { get; set; }
    
        [DataMember(Order=6)]
        public TfsEventStatusChange StatusChange { get; set; }
    
        [DataMember(Order=7)]
        public string ChangedBy { get; set; }
    }
    

    关于tfs - 如何使用 XML 命名空间让 ServiceStack 接收来自 TFS 的 XML 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18232746/

    相关文章:

    c# - Servicestack csharp 客户端与 Redis 或两者兼而有之?

    xml - 根据 WSDL(xsd 架构)验证 xml 时了解 elementFormDefault 合格/不合格

    tfs - 如何从远程 powershell 脚本设置任务变量?

    TFS 和 msbuild 版本号与最后一个变更集

    tfs - TF31002 : Unable to Connect to this Team Foundation server

    servicestack - 与 ServiceStack.OrmLite 的多对多关系

    dependency-injection - 在 ServiceStack API 应用程序中使用的正确 'per request' Simple Injector 生活方式是什么?

    c# - 将命名空间添加到自定义 XML 文件

    xml - 前缀 '' 不能在同一起始元素标记内从 '' 重新定义为 'http://www.sitemaps.org/schemas/sitemap/0.9'

    visual-studio-2012 - TFS 查询 - 如何确定谁创建了共享查询以及何时创建