Servicestack(rest)不正确的WSDL与mono

时间:2014-11-21 16:53:06

标签: soap mono wsdl servicestack

我编写了一个简单的自托管(在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端点的可行性?

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

Mono具有弱和部分WCF / SOAP支持,无法为许多非平凡的服务定义生成WSDL。由于Microsoft拥有开源.NET服务器库,这种情况在不久的将来可能会有所改善,但在此期间我建议如果您想使用SOAP,请避免使用Mono。