我用服务堆栈 3.9.70 编写了一个简单的自托管(在控制台应用程序中)休息服务。
using System;
using System.Runtime.Serialization;
// service stack support
using ServiceStack.ServiceHost;
using ServiceStack.WebHost.Endpoints;
namespace HelloWorldConsole
{
namespace DTO
{
[DataContract(Namespace = "http://localhost:8080/types")]
[Route("/hello/{Name}")]
class Hello : IReturn<HelloResponse>
{
[DataMember]
public string Name { get; set; }
}
[DataContract(Namespace = "http://localhost:8080/types")]
class HelloResponse
{
[DataMember]
public string Response { get; set; }
}
}
class HelloService : IService
{
public Object Any(DTO.Hello request)
{
return new DTO.HelloResponse { Response = "Hello " + request.Name };
}
}
public class HelloHost : AppHostHttpListenerBase
{
public HelloHost()
: base("Hello Service Self-Host",
typeof(HelloService).Assembly)
{ }
public override void Configure(Funq.Container container)
{
SetConfig(new EndpointHostConfig
{
DebugMode = true,
WsdlServiceNamespace = "http://localhost:8080/",
WsdlSoapActionNamespace = "http://localhost:8080/",
SoapServiceName = "HelloService"
});
}
}
class MainClass
{
public static void Main (string[] args)
{
string listenOn = "http://localhost:8080/";
HelloHost host = new HelloHost ();
host.Init ();
host.Start (listenOn);
Console.WriteLine ("AppHost created at {0} on {1}",
DateTime.Now, listenOn);
Console.ReadKey ();
}
}
}
在Windows下,生成的WSDL很好,如果我尝试创建一个客户端应用程序并在localhost上添加对soap服务的Web引用,我可以调用Hello。如果我使用 Mono 在 Linux 下运行相同的代码,则生成的 WSDL 不包含 DTO 命名空间中定义的类型。如果我尝试在客户端上添加 Web 服务引用,则无法利用 hello 方法。
在此链接中,我读到默认情况下,相同的ServiceStack Console应用程序二进制文件按原样在Windows/.NET和Mono/Linux上运行。我试图在窗口下启动二进制文件;服务运行,但生成的 WSDL 不正确(未在 DTO 命名空间中定义类型)。我使用单声道 2.10.8.1。
有人有什么建议吗?
我还有一个问题。如果我使用新版本服务堆栈最新版本 (4.0.33),我无法利用 SOAP 端点。
在此链接中,我读到SOAP端点在托管在HttpListener主机上时不可用。这是新版本 4.0 引入的功能吗?难道没有利用服务堆栈版本高于 3.9 的 SOAP 端点的可能性吗?
任何帮助,不胜感激。
Mono 具有弱和部分的 WCF/SOAP 支持,将无法为许多重要的服务定义生成 WSDL。这种情况在不久的将来可能会有所改善,因为Microsoft已经开源了.NET服务器库,但在此期间,如果你想使用SOAP,我建议避免使用Mono。