對於不同的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;
}
}
我沒有...所以我的職務。文檔在這方面非常高,並且有些簡潔,幾乎有目的地模糊。嘿,如果不能完成,就這樣吧。我只是想確保情況是這樣,而不是繼續進行大雁追逐。謝謝回覆。 – Guillo
@Guillo由於您的Request DTO被稱爲GetWidgetsRequest而不是GetWidgets Request DTO和GetWidgetsResponse的特定約定,因此我沒有看到任何顯示您已閱讀它的內容。響應DTO讓我覺得你沒有這樣做,噸。該文檔顯示了您可以執行的所有自定義設置,即使用** DataContract **屬性和'Config.WsdlServiceNamespace'中的XML名稱空間定製響應,並且可以使用'IRequiresSoapMessage'處理原始消息,而不是需要在服務實現中設置任何額外的HTTP頭。 – mythz
感謝您澄清...相信我,我確實讀過它,但現在我意識到我只是誤讀了請求/響應DTO的命名約定。配置命名空間就是這樣,它不會讓我得到我需要的,它將影響端點的地址。也許我沒有解釋我非常需要的東西,所以如果我到達我正在尋找的狀態,我會確保我再次發佈信息。 – Guillo