我们需要支持SOAP和REST接口,实际上是同一个函数调用。我理解SOAP是一种协议,而REST是一种架构风格,但我也确信Web服务开发人员知道我在谈论什么;所以不要被迂腐的细节分散注意力。此外,我要求避免SOAP 与 REST辩论 - 我们需要 两者 以满足不同客户的业务需求。该平台是ASP.NET 4.0。
的 REST: 的
我正在使用WCF,而FunctionA基本上使用inputData来生成OutputData。我有通过[ServiceContract]定义的抽象接口和通过[WebInvoke]关键字公开的实际服务逻辑。即。
[WebInvoke(UriTemplate = "funcA", Method = "POST", RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml)]
public OutputType FunctionA(InputType inputData)
的 SOAP 的
对于SOAP接口,我基本上需要相同的inputData进入相同的FunctionA(),它会吐出相同的OutputData(类型为OutputType)。当然,这些将包装在SOAP信封等中。
所以我的问题是:如何利用框架,以便使用最少的自定义代码将SOAP接口支持到相同的功能?
答案 0 :(得分:1)
在下面找到我提供的支持SOAP和REST的服务
[ServiceContract]
public interface ISampleService
{
[WebGet]
[OperationContract]
string GetData();
}
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class SampleService : ISampleService
{
public string GetData()
{
return "Welcome to server";
}
}
我的web.config将包含以下内容
<system.serviceModel>
<bindings>
<webHttpBinding>
<binding name="RestBinding">
<readerQuotas maxStringContentLength="5242880" maxArrayLength="16384"
maxBytesPerRead="4096" />
<security mode="TransportCredentialOnly">
<transport clientCredentialType="None" />
</security>
</binding>
</webHttpBinding>
</bindings>
<services>
<service name="XMLService.SampleService">
<endpoint address="" behaviorConfiguration="web" binding="webHttpBinding"
bindingConfiguration="RestBinding" name="SampleService" contract="XMLService.ISampleService" />
<endpoint address="soap" binding="basicHttpBinding" contract="XMLService.ISampleService" />
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="web">
<webHttp/>
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior>
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="true"/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
</system.serviceModel>
现在,您服务的网址如下所示:
REST - &gt; http://localhost/SampleApp/SampleService.svc/GetData
SOAP - &gt; http://localhost/SampleApp/SampleService.svc
如果您希望REST网址干净,即不包含.svc,那么您可以按照WebAPI方法在Global.asax中注册路由,并从配置中删除端点。您可以为POST操作执行相同的操作。还要确保如果传递复杂类型,则需要让服务知道如下所示的类型
[KnownType(typeof(SampleItem))]
上述属性需要放在实现接口的类上。
答案 1 :(得分:0)
我正在研究的其中一个项目具有这种确切的功能。
我们的WCF服务多累了
服务层有2个端点
终点非常薄,基本上使用BLL的方法。举个例子,功能A将在业务逻辑层中定义,完成所有工作。每个端点也都有FunctionA,它从BLL调用FunctionA。
Visual Studio解决方案包括每个BLL和DAL图层的项目以及每个端点的项目。还有一些其他项目用于单元测试等
答案 2 :(得分:0)
你有两个不错的选择: 创建SOAP服务和REST服务。每个calsl的端点是一个共享类(所以没有代码重复,例如:
//SOAP endpoint
[webmethod]
public void DoSomething(int id)
{
myClass.MethodThatActuallyDoesTheWork(id);
}
//in another service we have the REST methods
//REST endpoint
public void DoSomething(int id)
{
myClass.MethodThatActuallyDoesTheWork(id);
}
OR(我的首选方法)
通过Nuget(或其他)安装WCFWebAPI因为这允许content negotioation,因为您在服务中编写了一个方法。如果客户端指定Accept:application / xml,则返回XML,如果客户端指定Accept:application / json,则返回JSON。 我不确定这是否会产生WSDL - 如果你使用soap'cos你想要XML那么这是一个很好的方法。如果您需要WSDL,那么两个服务可能会更好。
无论如何,值得深思。希望这会有所帮助。
如果您需要测试基于WSDL的XML服务,WCFTestClient非常方便。 WCFWebApi实际上也为您生成测试/帮助页面。太棒了。