Question

Je dois avoir des problèmes de configuration de wcf. J'ai un service Web WCF que je souhaite pouvoir accéder via un navigateur Web à l'aide d'obtenir des paramètres (et éventuellement en PHP avec simpplexml_load_file ()). Ma solution Visual Studio est configurée sous la forme d'un projet de bibliothèque de services de WCF contenant une interface (où le service est défini), une classe (où le service est implémenté et une application app.config (qui y était par défaut). J'ai aussi un Projet de service WCF contenant un fichier .SVC (qui pointe vers ma classe) et un web.config. Mon interface de service est conçue comme ceci:

using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using RTXEngineLib.externalLibrary;
namespace RTXEngineLib {
    [ServiceContract(Name = "RTXEngine", Namespace = "")]
    public interface IRTXEngine {
        [OperationContract(Name = "GetCountryList"), WebGet(UriTemplate = "/GetCountryList/", ResponseFormat = WebMessageFormat.Xml)]
        List<Country> GetCountryList();
        [OperationContract(Name = "GetRegions"), WebGet(UriTemplate = "/GetRegions/?countryID={countryID}", ResponseFormat = WebMessageFormat.Xml)]
        List<Region> GetRegions(int countryID);
        [OperationContract(Name = "GetExchangeAvailability"), WebGet(UriTemplate = "/GetExchangeAvailability/?countryID={countryID}&month={month}&year={year}&regionID={regionID}&resortID={resortID}", ResponseFormat = WebMessageFormat.Xml)]
        AvailabilityList GetExchangeAvailability(int countryID, String month, int year, String regionID = "?", String resortID = "");
        [OperationContract(Name = "GetResortsForDate"), WebGet(UriTemplate = "/GetResortsForDate/?month={month}&year={year}", ResponseFormat = WebMessageFormat.Xml)]
        List<AvailabilityList> GetResortsForDate(String month, int year);
        [OperationContract(Name = "GetRegionLists"), WebGet(UriTemplate = "/GetRegionLists/", ResponseFormat = WebMessageFormat.Xml)]
        List<RegionList> GetRegionLists();
        [OperationContract(Name = "GetRegionListCacheState"), WebGet(UriTemplate = "/GetRegionListCacheState/", ResponseFormat = WebMessageFormat.Xml)]
        Boolean GetRegionListCacheState();
    }
    [DataContract(Namespace = "")]
    public class LoginRequestResponse {
        [DataMember]
        public Boolean Success { get; set; }
        [DataMember]
        public AccountStanding AccountStanding { get; set; }
        [DataMember]
        public double FTXBalance { get; set; }
        [DataMember]
        public List<User> Users { get; set; }
        [DataMember]
        public List<ContractData> Contracts { get; set; }
    }
    [DataContract(Namespace = "")]
    public enum AccountType {
        [DataMember]
        NonAuthenticatedAccount,
        [DataMember]
        AC,
        [DataMember]
        PT,
        [DataMember]
        Wks
    }
    [DataContract(Namespace = "")]
    public enum AccountStanding {
        [DataMember]
        NotAuthenticated,
        [DataMember]
        Good,
        [DataMember]
        Mixed,
        [DataMember]
        Delinquent
    }
    [DataContract(Namespace = "")]
    public struct RegionList {
        [DataMember]
        public String CountryName { get; set; }
        [DataMember]
        public String CountryID { get; set; }
        [DataMember]
        public List<Region> Regions { get; set; }
    }
    [DataContract(Namespace = "")]
    public struct Country {
        [DataMember]
        public String CountryName { get; set; }
        [DataMember]
        public String ID { get; set; }
    }
    [DataContract(Namespace = "")]
    public struct Region {
        [DataMember]
        public String RegionName { get; set; }
        [DataMember]
        public String ID { get; set; }
    }
    [DataContract(Namespace = "")]
    public struct User {
        [DataMember]
        public String FirstName { get; set; }
        [DataMember]
        public String LastName { get; set; }
        [DataMember]
        public String Address { get; set; }
        [DataMember]
        public String City { get; set; }
        [DataMember]
        public String State { get; set; }
        [DataMember]
        public String Zip { get; set; }
        [DataMember]
        public String CountryOfResidence { get; set; }
        [DataMember]
        public String PhoneNumber { get; set; }
    }
    [DataContract(Namespace = "")]
    public struct ContractData {
        [DataMember]
        public String ContractID { get; set; }
        [DataMember]
        public AccountType AccountType { get; set; }
        [DataMember]
        public AccountStanding AccountStanding { get; set; }
        [DataMember]
        public String AvailablePoints { get; set; }
        [DataMember]
        public String UnavailablePoints { get; set; }
        [DataMember]
        public String Usage { get; set; }
    }
    [DataContract(Namespace = "")]
    public struct PointsData {
        [DataMember]
        public String ContractID { get; set; }
    }
    [DataContract(Namespace = "")]
    public class GlobalAppCache {
        [DataMember]
        public static DateTime RegionListsLastUpdate { get; set; }
        [DataMember]
        public static List<RegionList> CachedRegionLists { get; set; }
    }
}

et mon app.config pour la bibliothèque ressemble à ceci:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5555555555555555">
      <section name="RTXEngineLib.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
    </sectionGroup>
  </configSections>
  <system.web>
    <compilation debug="true"/>
  </system.web>
  <!-- When deploying the service library project, the content of the config file must be added to the host's 
  app.config file. System.Configuration does not support config files for libraries. -->
  <system.serviceModel>
    <services>
      <service name="RTXEngineLib.RTXEngineLib">
        <endpoint address="" binding="wsHttpBinding" contract="RTXEngineLib.IRTXEngineLib">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8732/Design_Time_Addresses/RTXEngineLib/RTXEngineLib/" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <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="False"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
  <applicationSettings>
    <RTXEngineLib.Properties.Settings>
      <setting name="RTXEngineLib_externalLibrary" serializeAs="String">
        <value>http://externalLibrary.com/websvcs/externalLibrary.asmx</value>
      </setting>
    </RTXEngineLib.Properties.Settings>
  </applicationSettings>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>

Et puis mon web.config est comme suit:

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <bindings>
      <webHttpBinding>
        <binding name="Web" sendTimeout="00:03:00" maxBufferSize="131072"
          maxReceivedMessageSize="131072" />
      </webHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="Basic" name="RTXEngineLib.RTXEngineLib">
        <endpoint address="http://devrtxengine.telemark/RTXService.svc"
          binding="webHttpBinding" bindingConfiguration="Web" name="Basic"
          contract="RTXEngineLib.IRTXEngine" listenUri="http://devrtxengine.myserver/RTXService.svc" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
        <behavior name="Basic">
          <serviceMetadata httpGetEnabled="true" />
        </behavior>
        <behavior name="Web">
          <serviceMetadata httpGetEnabled="true" httpGetBinding="webHttpBinding"
            httpGetBindingConfiguration="" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="false" />
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>  
</configuration>

Lorsque j'essaie d'exécuter mon service à l'aide de http://devrtxengine.myserver/RTXService.svc/GetCountryList I, je vous retrouve avec l'erreur suivante:

<Fault xmlns="http://schemas.microsoft.com/ws/2005/05/envelope/none">
<Code>
<Value>Sender</Value>
<Subcode>
<Value xmlns:a="http://schemas.microsoft.com/ws/2005/05/addressing/none">a:DestinationUnreachable</Value>
</Subcode>
</Code>
<Reason>
<Text xml:lang="en-US">
The message with To 'http://devrtxengine.telemark/RTXService.svc/GetCountryList' cannot be processed at the receiver, due to an AddressFilter mismatch at the EndpointDispatcher. Check that the sender and receiver's EndpointAddresses agree.
</Text>
</Reason>
</Fault>

Je soupçonne qu'il existe une sorte d'inadéquation entre mon app.config et mon web.config, mais chaque fois que j'essaie de changer quelque chose dans mon web.config, je brise mon service encore plus qu'il n'est déjà brisé. Est-ce que quelqu'un avec plus d'expérience de la WCF a des conseils?

Était-ce utile?

La solution

J'ai remarqué que l'adressement du point final était devrtxengine.telemark, mais vous avez l'écoute comme devtrtxengine.myServer.Je ne sais pas si c'est une faute de frappe ou si cela ferait une différence.De plus, vous pouvez essayer d'ajouter le webhttpbinding aux comportements - voir Résolution des erreurs de configuration dans WCFMismachatter d'adresses pour un exemple.

Autres conseils

Voici ce que je vérifie quand je rencontre cette erreur:

* endpoint is missing in web.config, 
* doublecheck the UriTemplate path
* make sure to set an endpointBehavior inside behaviors, such as 
  < endpointBehaviors >
    < behavior name =" web" >
      < webHttp />
    </ behavior >
  </ endpointBehaviors >
* and set behaviorConfiguration="web" on endpoint your individual endpoint

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top