没有Web服务器的独立c#Web服务

时间:2014-01-07 09:36:11

标签: c# web-services soap wsdl asmx

我想使用c#实现一个Web服务。我有兴趣实现服务器而不是消费者。 Web服务必须由独立的软件运行,因为我没有像IIS这样的Web服务器来部署它。

在Linux / Unix中我知道我可以使用wsdl文件,我使用gsoap为它生成C代码,我在服务器端实现例程,并构建连接libgsoap的独立程序。

现在我想用c#和.net平台做同样的事情。

我用来研究它的wsdl文件和gsoap一样,你可以找到它here

下一步是下载并运行wsdl -server cal.wsdl以获取calc.cs

此时我被卡住了,因为我无法找到有关如何做的文档 继续进行。

如何实现扩展抽象类calc的程序,通过运行启动小型Web服务器的wsdl来获取所需的函数?你能指点我一些好的文件吗?

当我运行wsdl -server cal.wsdl时,我会收到此代码

/// <remarks/>
/// <remarks>
///gSOAP 2.7.9k generated service definition
///</remarks>
[System.Web.Services.WebServiceAttribute(Namespace="http://websrv.cs.fsu.edu/~engelen/calc.wsdl")]
[System.Web.Services.WebServiceBinding(Name="calc", Namespace="http://websrv.cs.fsu.edu/~engelen/calc.wsdl")]
public abstract partial class calc : System.Web.Services.WebService {

    /// <remarks>
///Service definition of function ns__add
///</remarks>
    [System.Web.Services.WebMethodAttribute()]
    [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="urn:calc", ResponseNamespace="urn:calc")]
    [return: System.Xml.Serialization.SoapElement("result")]
    public abstract double add(double a, double b);

    /// <remarks>
///Service definition of function ns__sub
///</remarks>
    [System.Web.Services.WebMethodAttribute()]
    [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="urn:calc", ResponseNamespace="urn:calc")]
    [return: System.Xml.Serialization.SoapElement("result")]
    public abstract double sub(double a, double b);

    /// <remarks>
///Service definition of function ns__mul
///</remarks>
    [System.Web.Services.WebMethodAttribute()]
    [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="urn:calc", ResponseNamespace="urn:calc")]
    [return: System.Xml.Serialization.SoapElement("result")]
    public abstract double mul(double a, double b);

    /// <remarks>
///Service definition of function ns__div
///</remarks>
    [System.Web.Services.WebMethodAttribute()]
    [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="urn:calc", ResponseNamespace="urn:calc")]
    [return: System.Xml.Serialization.SoapElement("result")]
    public abstract double div(double a, double b);

    /// <remarks>
///Service definition of function ns__pow
///</remarks>
    [System.Web.Services.WebMethodAttribute()]
    [System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="urn:calc", ResponseNamespace="urn:calc")]
    [return: System.Xml.Serialization.SoapElement("result")]
    public abstract double pow(double a, double b);
}

这是一个抽象类,因为服务器端的所有方法都没有实现。因此,我希望,与我通常使用gsoap一样,我将不得不扩展这个类并覆盖抽象方法,这很容易。

问题在于,之后我不知道如何编写一个程序来接受继承的类并启动Web服务器并在网络上公开Web服务。

1 个答案:

答案 0 :(得分:3)

这不是那么复杂,但需要你身边的一些工作。您可以使用WCF技术创建服务。

我想你将使用Visual Studio并为.NET创建一个应用程序。如果您的目标是Mono,则必须采用以下示例。

1 - 创建一个控制台.NET项目,并手动添加对System.ServiceModel和System.Runtime.Serialization的引用。

2 - 您应该将抽象类转换为接口。这将是您工作中最难的部分,因为您应该获得相同的WSDL。

例如:

[System.Web.Services.WebServiceAttribute(Namespace="http://websrv.cs.fsu.edu/~engelen/calc.wsdl")]
[System.Web.Services.WebServiceBinding(Name="calc", Namespace="http://websrv.cs.fsu.edu/~engelen/calc.wsdl")]
public abstract partial class calc : System.Web.Services.WebService {
/// <remarks>
///Service definition of function ns__add
///</remarks>
[System.Web.Services.WebMethodAttribute()]
[System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="urn:calc", ResponseNamespace="urn:calc")]
[return: System.Xml.Serialization.SoapElement("result")]
public abstract double add(double a, double b); 

转换示例:

using System.ServiceModel;
// other usings, namespace etc

[ServiceContract(Namespace = "http://websrv.cs.fsu.edu/~engelen/calc.wsdl", Name = "calc")]
public interface ICalcService
{
    [OperationContract(Name = "add")]
    [return: MessageParameter(Name = "result")]
    [XmlSerializerFormatAttribute(Style=OperationFormatStyle.Rpc, Use=OperationFormatUse.Encoded)]
    double add(double a, double b);

    // the rest of methods
}

或者,您可以尝试使用svcutil:

生成C#代理类
svcutil http://www.genivia.com/calc.wsdl

您将获得calc.cs,因此您可以从中获取服务和数据合同。

3 - 无论如何,在使用服务合同创建接口后,您将创建其实现:

public class CalcServiceImpl : ICalsService
{
    public double add(double a, double b)
    {
        return a + b;
    }

    // the rest
}

4 - 之后你应该创建一个ServiceHost实例。像那样:

ServiceHost host = new ServiceHost(typeof(CalcServiceImpl), new Uri("http://myhost/MyServices")))
host.AddServiceEndpoint(typeof(ICalcService), new BasicHttpBinding(), "CalcService");
host.Open();
Console.ReadKey();
host.Close();

当然,这是一个非常简单的例子,但我希望它会给你指路。