我想使用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服务。
答案 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();
当然,这是一个非常简单的例子,但我希望它会给你指路。