servicestack,xml-namespaces,Tfs,servicestack,Xml Namespaces" /> servicestack,xml-namespaces,Tfs,servicestack,Xml Namespaces" />

如何让ServiceStack使用XML名称空间从TFS接收XML请求

如何让ServiceStack使用XML名称空间从TFS接收XML请求,tfs,servicestack,xml-namespaces,Tfs,servicestack,Xml Namespaces,我正在尝试将TFS 2012事件通知连接到ServiceStack,但我一直收到错误: { "responseStatus": { "errorCode": "RequestBindingException", "message": "Unable to bind request", "stackTrace": "at ServiceStack.WebHost.Endpoints.RestHandler.GetRequest(IHttpRe

我正在尝试将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; }
}
[路由(“/releasemanagement/tfsevents/buildcomplete”,“POST”)]
[DataContract(命名空间=”http://www.w3.org/2001/XMLSchema-instance")]
公共类TfsEventBuildComplete:IReturn
{
[数据成员]
公共字符串BuildUri{get;set;}
[数据成员]
公共字符串TeamFoundationServerUrl{get;set;}
[数据成员]
公共字符串TeamProject{get;set;}
[数据成员]
公共字符串标题{get;set;}
[数据成员]
公共字符串Id{get;set;}
[数据成员]
公共TfsEventStatusChange状态更改{get;set;}
[数据成员]
公共字符串由{get;set;}更改
}
公共类TfsEventStatusChange
{
公共字符串字段名{get;set;}
公共字符串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>

vstfs:///Build/Build/4799
http://TFSURL:8080/tfs/collection
伊萨姆
iSAMS构建版本\U 20130814.1质量更改为发布
[02]\项目收集服务帐户
发布号:20130814.1
http://TFSURL:8080/tfs/web/build.aspx?pcguid=GUID&builduri=vstfs:///Build/Build/4799
格林尼治标准时间昼间
+01:00:00
2013年8月14日上午9:33:30
品质
发表
域\用户
我认为ServiceStack由于名称空间的原因实际上无法对请求进行反序列化,但我无法理解这一点

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


以下是我为使示例请求XML正常工作所做的工作:

  • DataContract
    属性的
    Name
    属性设置为
    BuildStatusChangeEvent
    。这控制顶级XML元素的预期名称。否则,ServiceStack将期望XML看起来像
  • DataContract
    属性的
    Namespace
    属性设置为空字符串,以便请求中不需要特定的
    xmlns
    属性
  • 设置
    DataMember
    属性的
    Order
    属性,以指定从TFS获取的XML中XML元素的排序顺序。默认情况下,XML序列化程序将期望对元素进行排序,因此必须重写此项,否则部分属性将无法正确反序列化
  • [路由(“/releasemanagement/tfsevents/buildcomplete”,“POST”)]
    [DataContract(Namespace=”“,Name=“BuildStatusChangeEvent”)]
    公共类TfsEventBuildComplete:IReturn
    {
    [数据成员(顺序=1)]
    公共字符串BuildUri{get;set;}
    [数据成员(顺序=2)]
    公共字符串TeamFoundationServerUrl{get;set;}
    [数据成员(顺序=3)]
    公共字符串TeamProject{get;set;}
    [数据成员(顺序=4)]
    公共字符串标题{get;set;}
    [数据成员(顺序=5)]
    公共字符串Id{get;set;}
    [数据成员(顺序=6)]
    公共TfsEventStatusChange状态更改{get;set;}
    [数据成员(顺序=7)]
    公共字符串由{get;set;}更改
    }
    
    您是否尝试过类似于链接到的相关帖子的
    [DataContract(Namespace=”“)]
    ?请注意,您的XML示例没有
    xmlns=“…”
    ,而是
    xmlns:xsd=…
    xmlns:xsi=…
    。我相信这会有很大的不同。是的,我试过了。我提到的问题与我想要的正好相反。因此,我首先尝试了一个空的名称空间,然后尝试模拟XML中的内容(示例中的内容),现在可以了。非常感谢你的帮助!我不再认为JSON是理所当然的。