2013-11-14 71 views
2

我知道我可以歸咎於該DTO的我可以更改默認「/ soap11」以取得ServiceStack實施

[Route("/widgets", "GET, POST")] 
[DataContract()] 
public class GetWidgetsRequest 
{ 
    [DataMember] 
    public string OutletCode { get; set; } 
    [DataMember] 
    public IList<Specification> WidgetsCaptured { get; set; } 
} 

管理的REST-FUL接口操作的路線SOAP端點的路線,但我已搜查並試圖在試圖影響給定SOAP操作的端點的默認/ soap11附錄時嘗試失敗。

**POST /soap11 HTTP/1.1** 
Host: localhost  
Content-Type: text/xml; charset=utf-8 
Content-Length: nnn 
SOAPAction: GetItemsRequest 

的問題是,什麼是我的選擇,以及如何配置不同的端點設置內的更廣泛的問題?

謝謝!

回答

0

有關在ServiceStack中使用SOAP的準則和限制,請閱讀SOAP Support docs

+0

我沒有...所以我的職務。文檔在這方面非常高,並且有些簡潔,幾乎有目的地模糊。嘿,如果不能完成,就這樣吧。我只是想確保情況是這樣,而不是繼續進行大雁追逐。謝謝回覆。 – Guillo

+0

@Guillo由於您的Request DTO被稱爲GetWidgetsRequest而不是GetWidgets Request DTO和GetWidgetsResponse的特定約定,因此我沒有看到任何顯示您已閱讀它的內容。響應DTO讓我覺得你沒有這樣做,噸。該文檔顯示了您可以執行的所有自定義設置,即使用** DataContract **屬性和'Config.WsdlServiceNamespace'中的XML名稱空間定製響應,並且可以使用'IRequiresSoapMessage'處理原始消息,而不是需要在服務實現中設置任何額外的HTTP頭。 – mythz

+0

感謝您澄清...相信我,我確實讀過它,但現在我意識到我只是誤讀了請求/響應DTO的命名約定。配置命名空間就是這樣,它不會讓我得到我需要的,它將影響端點的地址。也許我沒有解釋我非常需要的東西,所以如果我到達我正在尋找的狀態,我會確保我再次發佈信息。 – Guillo

0

對於不同的SOAP路徑,例如〜/ services,您可以添加自己的servicestack插件,它將返回您自己的servicestack soap處理程序。

public class MySoapFeature : IPlugin 
{ 
    private static IHttpHandler GetHandlerForPathParts(string[] pathParts) 
    { 
     string str2 = string.Intern(pathParts[0].ToLower()); 
     if (pathParts.Length != 1) return null; 
     if (str2 == "services") 
     { 
      return new MySoapHttpHandler(); 
     } 

     return null; 
    } 

    public IHttpHandler ProcessRequest(string httpMethod, string pathInfo, string filePath) 
    { 
     char[] chrArray = new char[] { '/' }; 
     string[] strArrays = pathInfo.TrimStart(chrArray).Split(new char[] { '/' }); 
     if ((int)strArrays.Length == 0) 
     { 
      return null; 
     } 

     return MySoapFeature.GetHandlerForPathParts(strArrays); 
    } 

    public void Register(IAppHost appHost) 
    { 
     appHost.CatchAllHandlers.Add(this.ProcessRequest); 
    } 
} 

然後實現基於Soap11Handler或Soap12Handler

此處理
public class MySoapHttpHandler : Soap11Handler, IHttpHandler 
{ 
    public MySoapHttpHandler() 
     : base((EndpointAttributes)((long)32768)) 
    { 
    } 

    public new void ProcessRequest(HttpContext context) 
    { 
     if (context.Request.HttpMethod == "GET") 
     { 
      (new Soap11WsdlMetadataHandler()).Execute(context); 
      return; 
     } 

     Message message = base.Send(null); 
     context.Response.ContentType = base.GetSoapContentType(context.Request.ContentType); 
     using (XmlWriter xmlWriter = XmlWriter.Create(context.Response.OutputStream)) 
     { 
      message.WriteMessage(xmlWriter); 
     } 
    } 


    public override void ProcessRequest(IHttpRequest httpReq, IHttpResponse httpRes, string operationName) 
    { 
     if (httpReq.HttpMethod == "GET") 
     { 
      (new Soap11WsdlMetadataHandler()).Execute(httpReq, httpRes); 
      return; 
     } 

     Message message = base.Send(null, httpReq, httpRes); 
     httpRes.ContentType = base.GetSoapContentType(httpReq.ContentType); 
     using (XmlWriter xmlWriter = XmlWriter.Create(httpRes.OutputStream)) 
     { 
      message.WriteMessage(xmlWriter); 
     } 
    } 

然後在servicestack註冊您的插件APPHOST配置()

Plugins.Add(new MySoapFeature()); 

然後創建您的DTO類的請求和響應。將「響應」添加到響應dto類名稱中。不要在請求Dto中放置一個Route屬性,因爲它由Xml中的Soap方法名稱路由。

[DataContract(Namespace = "http://mynamespace/schemas/blah/1.0")] 
public class MySoapMethod 
{} 


DataContract(Namespace = "http://mynamespace/schemas/blah/1.0")] 
public class MySoapMethodResponse 
{ 
    [DataMember] 
    public string SomeProperty { get; set; } 
} 

然後有一個服務來實現皁DTO的

public class SOAPService : Service 
{ 
    public MySoapMethodResponse Post(MySoapMethod request) 
    { 
     var response = new MySoapMethodResponse(); 
     response.SomeProperty = "blah"; 
     return response; 
    } 
} 
相關問題