2012-02-16 3 views
2

Проект REST работает отлично, это могут быть доступны через этот адрес:Объединение WCF SOAP и REST

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

У меня также есть проект SOAP WCF в моем 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, как я могу это сделать ? Большое спасибо!

EDIT

Когда я пытаюсь "Сделать стартовой" в SVC-файл, я получаю эту ошибку:

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

EDIT 2

Теперь я узнал, реальная проблема.

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

+0

Когда вы говорите, что у вас проект WCF SOAP в проекте REST, вы имеете в виду два разных проекта в одном решении или 2 службы в одном проекте? Также попробуйте переместить файл svc из пути, который соответствует коллекции маршрутов, и это должно быть хорошо. – Rajesh

+0

2 услуги в одном проекте. – fiberOptics

ответ

3

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

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

sample screenshot

UPDATE: Пожалуйста, найдите мою сеть.Config (Мое приложение размещается на IIS):

web.config

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

class

+0

Кажется, мы сделали почти то же самое, может быть, у моего webconfig есть что-то не хватает? Можете ли вы показать вам webConfig? Благодарю. Я попробую, что ты сделал. – fiberOptics

+0

Обновлен мой ответ с помощью скриншота web.config – Rajesh

+0

Я попытался следовать за вами, а затем нашел причину ошибки. См. Мой отредактированный вопрос. – fiberOptics

0

В то время как я ценю решение, перечисленное выше - я найденная гораздо проще управлять/развертывать, если вы не задумываетесь над этой проблемой и следуете принципу 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> 

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