web-dev-qa-db-fra.com

Erreur WCF: adresses de point final relatives

Um tout à fait nouveau à la WCF. Je pense avoir un peu foiré. C’est donc ce que j’ai fait jusqu’à présent et j’ai hébergé mon service WCF dans IIS

D'abord les contrats

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using YangkeeServer.dto;

namespace YangkeeServer
   {

public class Service1 : IService1
{
    [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "single")]
    public YangkeeTrailerDTO getTrailor()
    {
        return new YangkeeTrailerDTO()
        {
            loanFrom = "heaven"
        };
    }


    [WebInvoke(Method = "GET",
       ResponseFormat = WebMessageFormat.Json,
       UriTemplate = "datum/{id}")]
    public Test getName(string id)
    {
        return new Test()
        {
            Id = Convert.ToInt32(id) * 12,
            Name = "Leo Messi"
        };
    }
}
}

et ceci est mon fichier web.config

<?xml version="1.0"?>
<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />

  </system.web>
  <system.serviceModel>

    <services>

      <service name="YangkeeServer.Service1">

        <endpoint
          contract="YangkeeServer.IService1"
         binding="webHttpBinding"
         behaviorConfiguration="WebHttp"
         address="http://localhost:7000/Service1.svc">
       </endpoint>

     </service>

      <service name="YangkeeServer.Service2">

       <endpoint
          contract="YangkeeServer.IService2"
         binding="webHttpBinding"
         behaviorConfiguration="WebHttp"
         address="http://localhost:7000/Service2.svc">
       </endpoint>

     </service>

      <service name="YangkeeServer.YangkeeTrailer">

        <endpoint
          contract="YangkeeServer.IYangkeeTrailor"
          binding="webHttpBinding"
          behaviorConfiguration="WebHttp"
         address="http://localhost:7000/YangkeeTrailor.svc">
        </endpoint>

      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
       <behavior name="WebHttp">
         <webHttp />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
   <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
 </system.serviceModel>
 <system.webServer>
   <modules runAllManagedModulesForAllRequests="true"/>
 </system.webServer>

 </configuration>

et um utilisant cette urlhttp: // localhost: 7000/Service1.svc et um obtenant cette erreur

Server Error in '/' Application.

When 'system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled' is set to true     in configuration, the endpoints are required to specify a relative address. If you are specifying a     relative listen URI on the endpoint, then the address can be absolute. To fix this problem, specify a relative uri for endpoint 'http://localhost:7000/Service1.svc'.

quelqu'un peut-il me dire où est-ce que je me suis trompé? Merci d'avance.enter image description here

13
co2f2e

Définissez l'adresse du noeud final du service sur le nom de fichier du service (il s'agit de la partie relative):

address="Service1.svc"

ou définissez l'adresse en blanc pour chaque noeud final (je ne pense pas que ce soit nécessaire lors de l'hébergement dans l'environnement de développement ou dans IIS)

address=""

Voir cette réponse à une autre question

La partie pertinente est: 

le répertoire virtuel (dans IIS) où votre fichier * .svc existe définit l'adresse de votre point de terminaison de service.

31
Paul Anderson

Pour corriger cette erreur, j'ai ajouté ... listenUri = "/" ... au noeud final du service.

Exemple:

<service name="_name_">
  <endpoint address="http://localhost:_port_/.../_servicename_.svc"
    name="_servicename_Endpoint" 
    binding="basicHttpBinding"
    bindingConfiguration="GenericServiceBinding"
    contract="_contractpath_._contractname_"
    listenUri="/" />
</service>

MSDN: plusieurs systèmes d'extrémité sur un seul ListenUri

9
cat5dev

Cela fonctionne pour moi:

1. Insérez ces lignes à l'intérieur du service:

 <Host>
      <baseAddresses>
        <add baseAddress="http://localhost:7000/Service1.svc" />
      </baseAddresses>
    </Host>

2. Définissez la valeur de l'adresse comme suit:

adresse = ""

Le code complet:

<service name="YangkeeServer.Service1">
        <Host>
          <baseAddresses>
            <add baseAddress="http://localhost:7000/Service1.svc" />
          </baseAddresses>
        </Host>
        <endpoint
           contract="YangkeeServer.IService1"
          binding="webHttpBinding"
          behaviorConfiguration="WebHttp"
          address="">
        </endpoint>
      </service>
0
Fábio