servicestack,tfs-events,Soap,Tfs,servicestack,Tfs Events" /> servicestack,tfs-events,Soap,Tfs,servicestack,Tfs Events" />

如何让ServiceStack接收SOAP请求?

如何让ServiceStack接收SOAP请求?,soap,tfs,servicestack,tfs-events,Soap,Tfs,servicestack,Tfs Events,我正在尝试使用TFS生成通知通知ServiceStack服务中的端点。TFS使用SOAP,我对SOAP几乎没有经验 每当TFS到达端点时,我的请求DTO中的所有属性都为空 我的代码如下: DTO [Route("/releasemanagement/tfsevents/buildcomplete", "POST")] [DataContract(Namespace = "", Name = "BuildStatusChangeEvent")] public class TfsEventBuild

我正在尝试使用TFS生成通知通知ServiceStack服务中的端点。TFS使用SOAP,我对SOAP几乎没有经验

每当TFS到达端点时,我的
请求DTO
中的所有属性都为空

我的代码如下:

DTO

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

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

    public string NewValue { get; set; }
}
[Route("/releasemanagement/tfsevents/buildcomplete", "POST")]
[DataContract(Namespace = "http://schemas.microsoft.com/TeamFoundation/2005/06/Services/Notification/03", Name = "Notify")]
public class Notify : IReturn<BuildCompleteResponse>
{
    [DataMember(Order = 1)]
    public string eventXml { get; set; }

    [DataMember(Order = 2)]
    public string tfsIdentityXml { get; set; }
}

更新

我已经成功地获得了SOAP请求,它看起来是这样的:

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">
    <s:Header xmlns:w="http://www.w3.org/2005/08/addressing">
        <w:Action>http://schemas.microsoft.com/TeamFoundation/2005/06/Services/Notification/03/Notify</w:Action>
        <w:To>http://192.168.232.51/ErrorReporting.Web/releasemanagement/tfsevents/buildcomplete</w:To>
</s:Header>
<s:Body>
    <Notify xmlns="http://schemas.microsoft.com/TeamFoundation/2005/06/Services/Notification/03">
        <eventXml>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;BuildCompletionEvent xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;&lt;BuildUri&gt;vstfs:///Build/Build/4818&lt;/BuildUri&gt;&lt;TeamFoundationServerUrl&gt;http://tfsdomain:8080/tfs/02&lt;/TeamFoundationServerUrl&gt;&lt;TeamProject&gt;projectname&lt;/TeamProject&gt;&lt;Id&gt;Test_20130815.10&lt;/Id&gt;&lt;Url&gt;http://tfsdomain:8080/tfs/web/build.aspx?pcguid=88661c27-0916-48cb-8e39-9b40d8beb457&amp;amp;builduri=vstfs:///Build/Build/4818&lt;/Url&gt;&lt;Title&gt;Build Test_20130815.10 Successfully Completed&lt;/Title&gt;&lt;CompletionStatus&gt;Successfully Completed&lt;/CompletionStatus&gt;&lt;Subscriber&gt;TFSSERVICE&lt;/Subscriber&gt;&lt;Configuration&gt;Test&lt;/Configuration&gt;&lt;RequestedBy&gt;domain\\username&lt;/RequestedBy&gt;&lt;TimeZone&gt;GMT Daylight Time&lt;/TimeZone&gt;&lt;TimeZoneOffset&gt;+01:00:00&lt;/TimeZoneOffset&gt;&lt;BuildStartTime&gt;8/15/2013 3:38:48 PM&lt;/BuildStartTime&gt;&lt;BuildCompleteTime&gt;8/15/2013 3:39:11 PM&lt;/BuildCompleteTime&gt;&lt;BuildMachine&gt;Master - Controller&lt;/BuildMachine&gt;&lt;/BuildCompletionEvent&gt;</eventXml>
        <tfsIdentityXml>&lt;TeamFoundationServer url="http://isams-tfs2012:8080/tfs/02/Services/v3.0/LocationService.asmx" /&gt;</tfsIdentityXml>
        <SubscriptionInfo>
            <Classification>&lt;PT N="management.domain.co.uk - Release build subscription." /&gt;</Classification>
            <ID>274</ID>
            <Subscriber>S-1-5-21-3680174039-3422584590-495469403-1397</Subscriber>
        </SubscriptionInfo>
    </Notify>
</s:Body>
</s:Envelope>
但我仍然没有任何快乐


更新2

我还尝试了以下方法:

[Route("/releasemanagement/tfsevents/buildcomplete", "POST")]
public class TfsBuildEvent : IRequiresSoapMessage
{
    public Message Message { get; set; }
}
但是
消息
也总是空的

我也尝试过使用
请求.GetSoapMessage()
,但这会产生错误:


给定的键在字典中不存在

我终于可以使用了

我的终端设置如下所示:

DTO

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

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

    public string NewValue { get; set; }
}
[Route("/releasemanagement/tfsevents/buildcomplete", "POST")]
[DataContract(Namespace = "http://schemas.microsoft.com/TeamFoundation/2005/06/Services/Notification/03", Name = "Notify")]
public class Notify : IReturn<BuildCompleteResponse>
{
    [DataMember(Order = 1)]
    public string eventXml { get; set; }

    [DataMember(Order = 2)]
    public string tfsIdentityXml { get; set; }
}
[路由(“/releasemanagement/tfsevents/buildcomplete”,“POST”)]
[DataContract(命名空间=”http://schemas.microsoft.com/TeamFoundation/2005/06/Services/Notification/03“,Name=“Notify”)]
公共类通知:IReturn
{
[数据成员(顺序=1)]
公共字符串eventXml{get;set;}
[数据成员(顺序=2)]
公共字符串tfsIdentityXml{get;set;}
}
我还将我的请求发布到了错误的URL。我将它发布到
路由
属性中定义的URL。但我应该一直发到
/soap12

重要

类名必须与soap主体中的开始元素名匹配。
DataContract
上的
Name
属性不适用于您。我原来的类名是
TfsEventBuildCompleteSoap
,但直到我重命名了类
Notify
,它才开始工作


您所说的“当它打包为SOAP请求时,它不起作用”到底是什么意思?XML示例只是普通XML,而不是SOAP请求。SOAP请求看起来像什么?所以我对SOAP知之甚少,但我的理解是SOAP是封装在信封中的。实际的要求,我看不出来。通过查看另一个名为
tfsdeployer
的产品的事件日志,我获得了上面的XML,该产品还侦听
BuildCompletionEvent
。我不确定如何获得TFS发送的实际请求。也许在TFS服务器上安装fiddler?我已经用更多信息更新了这个问题