我编写了一个简单的自托管(在ConsoleApplication中)服务堆栈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方法。
At this link我已经读过,默认情况下,相同的ServiceStack控制台应用程序二进制文件在Windows / .NET和Mono / Linux上都按原样运行。我试图在windows下启动二进制文件;服务运行但生成的WSDL不正确(没有在DTO命名空间中定义的类型)。 我用mono 2.10.8.1。
有没有人有任何建议?
我还有另一个问题。如果我使用新版Servicestack上一版本(4.0.33),我将无法利用soap端点。
At this link我已经读过在HttpListener主机上托管时SOAP端点不可用。它是新版本4.0引入的功能吗? 是否存在利用servicestack发布高于3.9的SOAP端点的可行性?
感谢任何帮助。
答案 0 :(得分:1)
Mono具有弱和部分WCF / SOAP支持,无法为许多非平凡的服务定义生成WSDL。由于Microsoft拥有开源.NET服务器库,这种情况在不久的将来可能会有所改善,但在此期间我建议如果您想使用SOAP,请避免使用Mono。