我已经得到了一些关于ASP Web API的信息。它看起来是web服务好东西,但是如何像WCF服务那样为我的API创建像WSDL这样的东西呢?3d party component如何使用我的服务?或者我需要手动描述我的每个方法?
发布于 2012-02-29 21:34:55
至于它看起来是否好看,这只是一个观点,所以试一试,看看(我个人喜欢它)
就WDSL而言,Web是一个WSDL,而不是基于SOAP的,所以没有RESTful支持,WCF有REST支持和SOAP,所以如果你需要SOAP服务和WSDL,这可能是一个更好的选择。ScottGu关于API的最新博客非常有趣,并且有教程的链接(WSDL生成问题也在评论中得到了回答)
http://weblogs.asp.net/scottgu/archive/2012/02/23/asp-net-web-api-part-1.aspx
发布于 2013-11-19 21:45:32
WebApi中没有SOAP或WSDL支持。如果你喜欢WebApi,你一定会喜欢同时支持REST和SOAP的ServiceStack。即使对于REST服务,您也可以使用服务堆栈生成WSDL。
发布于 2015-01-27 07:03:53
这是一个略有不同的场景,可能与OP 想要询问的情况略有不同,但这是对“如何像WCF服务那样为我的应用编程接口创建类似WSDL的东西”的更广泛的解释?
我遇到过这样一种情况,我们不能公开WCF服务,唯一的选择是WebAPI。然而,使用API的一方只支持SOAP/WSDL,并且有一个预定义的WSDL,他们需要集成商托管并遵循该WSDL。
为WSDL文件提供服务
一个WebAPI操作服务于WSDL文件,该文件只是一个静态WSDL文件。此方法不支持查询WSDL的各个部分。因此客户端必须使用URL request yourdomain.com/SomeRoot/SomeApiPath?wsdl,之后的任何查询字符串参数都将被忽略,并且将提供完整的WSDL。参数[FromUri] string wsdl确保为包含?wsdl的URL选择此操作,但不会包含任何值。
public IHttpActionResult SomeApiPath([FromUri] string wsdl)
{
System.IO.FileStream wsdlFileStream = System.IO.File.OpenRead(System.Web.HttpContext.Current.Server.MapPath("~/Content/SomeThing.wsdl"));
var response = new HttpResponseMessage(HttpStatusCode.OK);
response.Content = new StreamContent(wsdlFileStream);
response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("text/xml");
return ResponseMessage(response);
}这意味着您的API Action方法需要处理和响应XML SOAP请求。
处理SOAP请求
虽然WebAPI可以将参数绑定到XML请求,但我选择在操作中不使用参数,而是在每个操作中使用Request.Content.ReadAsStringAsync()来获取请求体(即XML SOAP请求),然后使用XML对其进行解析,以获得所需的特定值。这使我不必对XML可序列化POCO进行反向工程,使其与WSDL定义的请求结构相匹配。
创建SOAP响应
你可以使用Svcutil.exe和Visual Studio这样的工具来生成可序列化的C# POCO,因为我们没有使用WCF,所以你不会使用完整的服务契约,而只是拉出XML类POCOs,这样你就可以用数据填充它们,并将它们序列化为XML来创建响应。然而,创建具有所有正确名称空间引用的SOAP信封是非常具有挑战性的。我在一些地方修改了一下,实际上使用了字符串连接而不是XML序列化。序列化为XML字符串,并在StringContent响应中返回该字符串:
return ResponseMessage(
new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent(soapResponseBody, System.Text.Encoding.UTF8, "text/xml")
});注意:即使是异常也必须被捕获,并作为SOAP信封内的SOAP错误转换为XML。
我喜欢WebAPI,但当你不得不与另一个只支持SOAP/WSDL的系统集成时,它肯定不是你想要的工具。当您别无选择时,我提供上述内容作为解决此问题的方法的总结,但建议您使用除WebAPI之外的支持SOAP的框架。您肯定会遇到上述问题,并且需要有大量使用序列化和XML schema的经验才能了解如何解决这些问题。
有些人有一个预定义的WSDL,并要求其他人实现公开该WSDL的服务,这也很奇怪/很少见。换句话说,它们作为客户端集成在一起,而您是主机,但它们决定了请求的结构。通常情况正好相反,有些人使用预定义的WSDL公开了一个服务,而您必须实现一个客户端才能使用它,这通常要容易得多。
https://stackoverflow.com/questions/9500037
复制相似问题