Сочетание WCF SOAP и REST - PullRequest
       5

Сочетание WCF SOAP и REST

2 голосов
/ 16 февраля 2012

Проект REST работает нормально, к нему можно обратиться по этому адресу:

http://localhost:8525/Device/Login?deviceID=testid&password=a&serialNum=testserial

У меня также есть проект WCF SOAP в моем проекте REST, эти два проекта разделены в разные папки, «SOAP» и «REST».

Моя проблема в том, что после того, как я поставил этот код:

private void RegisterRoutes()
{
    RouteTable.Routes.Add(new ServiceRoute("Device", new WebServiceHostFactory(), typeof(Rest.DeviceComponent)));              
}  

Сейчас я не могу получить доступ к SOAP-сервису, к которому у меня был доступ раньше по этому адресу:

http://localhost:8525/DeviceComponent.svc (с использованием клиента WCFTest)

Вот WebConfig

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <behaviors>
      <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="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
    <standardEndpoints>
      <webHttpEndpoint>
        <!-- 
            Configure the WCF REST service base address via the global.asax.cs file and the default endpoint 
            via the attributes on the <standardEndpoint> element below
        -->
        <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true"/>
      </webHttpEndpoint>
    </standardEndpoints>
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </modules>
    <handlers>
      <add name="UrlRoutingHandler" preCondition="integratedMode" verb="*" path="UrlRouting.axd"/>
    </handlers>
  </system.webServer>
</configuration>

А внутри Global.asax.cs

private void RegisterRoutes()
{
    RouteTable.Routes.Add(new ServiceRoute("Device", new WebServiceHostFactory(), typeof(Rest.DeviceComponent)));
}    

Образец контракта SOAP

namespace TSDEVICE.SoapSVC.Interface
{
    [ServiceContract]
    public interface IDeviceComponent
    {
        [OperationContract]
        Session Login(string deviceID, string password, string serialNum, string ip);
        [OperationContract]
        bool Logout(DeviceSession session);
        [OperationContract]
        bool IsLatestVersion(DeviceSession session, int version);
        [OperationContract]
        byte[] DownloadLatest(DeviceSession details);
        [OperationContract]
        DateTime GetServerTime(DeviceSession session, long branchID);
        [OperationContract]
        bool AddDevice(UserSession session, Device deviceitem);
        [OperationContract]
        bool RemoveDevice(UserSession session, long deviceID);
    }
}  

И часть ОТДЫХА:

namespace TSDEVICE.Rest
{
    [ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
    public class DeviceComponent
    {
        [WebInvoke(UriTemplate = "Login?deviceID={deviceID}&password={password}&serialNum={serialNum}", Method = "POST")]
        [OperationContract]
        public TMODELDEVICE.Entities.Session Login(string deviceID, string password, string serialNum)
        {
            string ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
            TMODELDEVICE.Logic.DeviceComponent restDC = new TMODELDEVICE.Logic.DeviceComponent();
            return restDC.Login(deviceID, password, serialNum, ip);
        }

        public string Sample()
        {
            return "Hello";
        }
    }
}  

Мне нужно получить доступ к SOAP и REST, как я могу это сделать? Большое спасибо!

РЕДАКТИРОВАТЬ

Когда я пытаюсь «Сделать стартовой страницей» файл .svc, я получаю эту ошибку:

Failed to add a service. Service metadata may not be accessible. Make sure your service is running and exposing metadata.  

РЕДАКТИРОВАТЬ 2

Теперь я выяснил реальную проблему.

Когда режим совместимости ASP.NET в web.config == true, SOAP не работает, а REST требует этого. Что мне с этим делать? Спасибо

Ответы [ 2 ]

3 голосов
/ 16 февраля 2012

У меня есть проект REST, который предоставляется как сервисам REST, так и SOAP.Теперь я поместил файл .svc для службы SOAP, к которой некоторые клиенты обращаются.

На приведенном ниже снимке экрана показана структура папок моего проекта, конфигурация маршрута в global.asax, вывод, доступ к службе отдыха и доступфайл .svc (сервис SOAP)

sample screenshot

ОБНОВЛЕНИЕ: Пожалуйста, найдите мой web.Config (мое приложение размещено на IIS):

web.config

Пожалуйста, найдите мой класс, который реализует мой интерфейс ISampleService:

class

0 голосов
/ 20 ноября 2014

Хотя я ценю решения, перечисленные выше, я обнаружил, что управлять ими / развертывать гораздо проще, если вы не слишком задумываетесь над проблемой и будете следовать принципу KISS.

Договор на обслуживание: IService.cs

namespace DontTazeMe.Bro
{
    [ServiceContract]
    public interface IService
    {
        [OperationContract]
        [WebGet]
        List<GeoMapData> GetToTheChopper();
    }
}

Реализация: Service.cs

namespace DontTazeMe.Bro
{
    public class WSDLService : IService
    {
        public List<GeoMapData> GetToTheChopper()
        {
            return ItsNotEasyBeingChessy.Instance.GetToTheChopperGeoData();
        }
    }

    public class RESTService : WSDLService
    {
        // Let's move along folks, nothing to see here...
        // Seriously though - there is no need to duplicate the effort made in
        // the WSDLService class as it can be inherited and by proxy implementing 
        // the appropriate contract
    }
}

Конфигурация

<system.serviceModel>
    <services>
      <!-- SOAP Service -->
      <service name="DontTazeMe.Bro.WSDLService">
        <endpoint address="" binding="basicHttpBinding" contract="DontTazeMe.Bro.IService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8733/DontTazeMe.Bro/Service/" />
          </baseAddresses>
        </host>
      </service>
      <service name="DontTazeMe.Bro.RESTService">
        <endpoint address="" binding="webHttpBinding" contract="DontTazeMe.Bro.IService" behaviorConfiguration="Restful" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8733/DontTazeMe.Bro/Rest/Service/" />
          </baseAddresses>
        </host>
      </service>
      <behaviors>
      <endpointBehaviors>
        <behavior name="Restful">
          <webHttp defaultOutgoingResponseFormat="Json" defaultBodyStyle="Wrapped" />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

Этот метод прекрасно работает, не отвлекаясь на настройку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...