ASP.NET:公开与SOAP _and_ REST接口相同的核心功能

时间:2011-11-16 23:22:21

标签: asp.net wcf rest soap

我们需要支持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接口支持到相同的功能?

3 个答案:

答案 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个端点

  • SOAP
  • 恢复

终点非常薄,基本上使用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实际上也为您生成测试/帮助页面。太棒了。