如何让ServiceStack接收SOAP请求?
我正在尝试使用TFS生成通知通知ServiceStack服务中的端点。TFS使用SOAP,我对SOAP几乎没有经验 每当TFS到达端点时,我的如何让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
请求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><?xml version="1.0" encoding="utf-16"?><BuildCompletionEvent xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><BuildUri>vstfs:///Build/Build/4818</BuildUri><TeamFoundationServerUrl>http://tfsdomain:8080/tfs/02</TeamFoundationServerUrl><TeamProject>projectname</TeamProject><Id>Test_20130815.10</Id><Url>http://tfsdomain:8080/tfs/web/build.aspx?pcguid=88661c27-0916-48cb-8e39-9b40d8beb457&amp;builduri=vstfs:///Build/Build/4818</Url><Title>Build Test_20130815.10 Successfully Completed</Title><CompletionStatus>Successfully Completed</CompletionStatus><Subscriber>TFSSERVICE</Subscriber><Configuration>Test</Configuration><RequestedBy>domain\\username</RequestedBy><TimeZone>GMT Daylight Time</TimeZone><TimeZoneOffset>+01:00:00</TimeZoneOffset><BuildStartTime>8/15/2013 3:38:48 PM</BuildStartTime><BuildCompleteTime>8/15/2013 3:39:11 PM</BuildCompleteTime><BuildMachine>Master - Controller</BuildMachine></BuildCompletionEvent></eventXml>
<tfsIdentityXml><TeamFoundationServer url="http://isams-tfs2012:8080/tfs/02/Services/v3.0/LocationService.asmx" /></tfsIdentityXml>
<SubscriptionInfo>
<Classification><PT N="management.domain.co.uk - Release build subscription." /></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?我已经用更多信息更新了这个问题