WCF WebService / IIS Hosting & Problema di Configurazione di un Firewall

Ho un semplice WCF Web service. È ospitato su IIS nel sito web predefinito nella nostra produzione di dominio. (locale indirizzo: 10.10.20.100)

Per impostazione predefinita, questo sito web predefinito è il programma di installazione per “nessuno” IP sulla Porta 80: tuttavia, ho notato che questo ha causato il Servizio WCF per la generazione del file WSDL utilizzando i server di nome DNS locale. cioè tutti gli Uri nel wsdl sono stati

http://myserver.subdomain.domain.com/.../...

Questo non era buono, come ho bisogno di esporre questo servizio a siti che non hanno alcuna conoscenza di ambienti di produzione DNS interno. E questo particolare server non dispone di un Nome DNS esterno. Solo un Indirizzo IP esterno…

Ho avuto un certo successo con la modifica dell’Impostazione di IIS da “nessuno” -> “10.10.20.100”

In questo modo il Servizio di generare è WSDL con gli indirizzi in notazione Uri

http://10.10.20.100/.../...

Questo è bene per altre macchine all’interno del sottodominio e su altri sottodomini, ma è qui che mi si blocca. Il server con Indirizzo IP Esterno (1.2.3.4) è mappato attraverso alcune NAT/PAT la traduzione in modo che non è esplicitamente installazione nel server Impostazioni IP (cioè non vedi IP Config)

Quindi, se devo cambiare il Predefinito di IIS Indirizzo IP del Sito web da “nessuno” -> “1.2.3.4” come ho fatto per l’indirizzo interno, quindi il Servizio WCF appena torna con…

Bad Request (Invalid Hostname)

E se lascio IIS Configurato su un Indirizzo IP Interno, e tenta di accedere al servizio tramite l’Indirizzo IP esterno ho

No protocol binding matches the given address 
'http://1.2.3.4/TestService/Service.svc'. Protocol bindings are 
configured at the Site level in IIS or WAS configuration

C’è un modo per rendere IIS/WCF generare è WSDL URI con un Indirizzo IP esterno che non è esplicitamente configurato sul server ?

Qualcuno mi aiuti per favore, prima di dropkick di Servizi WCF, fuori dalla finestra.

  • Questa è una buona domanda. Perché è che le domande come questa non ottenere nessun upvotes, ma domande come “Stanco di programmazione GUI/Applicazioni di Business, cosa fare dopo?” arrivare a 4 nel giro di pochi minuti?
  • Io purtroppo non hanno risposta, anche se – posso solo offrire un upvote. +1.
  • Apprezzo le risposte finora i ragazzi. Sto andando provare a Steve suggerimento di oggi, sovrascrivendo il ServiceHost e se non funziona mi dovrò stringere i denti e ottenere sysop per ottenere un nome di dominio completo per il nostro Server API.
  • questa è la soluzione per risolvere questo problema stackoverflow.com/a/9671430

 

6 Replies
  1. 8

    È perché non avete il vostro host header set. Questo sembra un problema comune, ho eseguito in tutto il tempo. Non c’è la configurazione per gli uri che genera, si cerca il giusto indirizzo esaminando l’intestazione host del sito. Anche se è in una directory virtuale, è necessario andare al padre, nel tuo caso, la directory di default, e aggiungere un’intestazione host.

    Fammi sapere se non sai come fare questo.

    • Ho avuto lo stesso problema ed è stato risolto con questa soluzione, ma I pensiero è solo effettuato https di hosting. Forse non. Ho aggiunto l’intestazione host utilizzando il adsutil.vbs script sul server IIS. Forza la porta 443 per avere un nome host specifico, piuttosto che il valore di default.
    • Ma so che è possibile impostare le intestazioni host non attacchi, quindi forse vale la pena di provare.
    • come si fa ad aggiungere un’intestazione host ?
    • technet.microsoft.com/en-us/library/cc753195%28v=ws.10%29.aspx fornisce una guida su come impostare l’intestazione host
  2. 1

    Deve essere un indirizzo IP e non un nome di dominio completo? Scambiando per un nome di dominio completo e l’impostazione che nelle intestazioni host per il sito dell’associazione di via

    cscript //nologo %systemdrive%\inetpub\adminscripts\adsutil.vbs set W3SVC/1/ServerBindings ":80:hostname.example.com"

    del riciclo app piscina poi produrrà il nome host nel WSDL generato. Si ottiene i benefici che è possibile configurare un DNS interno che è possibile risolvere il nome di dominio completo per l’IP interno e un esterno DNS che risolve il tuo firewall IP, quindi lo stesso sistema di funzionare senza modifiche.

  3. 1

    Potrei essere in grado di prevenire Ninja violenza… se ho capito bene il tuo problema …
    È possibile specificare manualmente l’indirizzo completo, il servizio è necessario utilizzare il web.config invece di avere ServiceHost a capire per te. È necessario impostare l’indirizzo di base del servizio:

     <service behaviorConfiguration="Behaviour1" name="Api.Poll">
        <endpoint address="soap" binding="basicHttpBinding" bindingConfiguration="soapBinding"
          contract="Api.IPoll" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://www.mydomain.com/Api" />
            <add baseAddress="http://10.10.20.30/Api" />
          </baseAddresses>
        </host>
      </service>

    Utilizzando questo metodo, il servizio dovrebbe accettare l’indirizzo di base specificato, oltre il nome del servizio, con l’indirizzo dell’endpoint se si dispone di uno. Inoltre, si avrebbe bisogno di utilizzare un custom ServiceHostFactory per impostare l’indirizzo di base a livello di programmazione. Vedere di seguito:

        public class ServiceHostFactory : System.ServiceModel.Activation.ServiceHostFactory
    {
        protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
        {                        
            ServiceHost host;
    
            host = new ServiceHost(serviceType, baseAddresses[0]);
    
            return host;
        }

    Infine, una volta costruire la ServiceHostFactory classe, è necessario collegarlo al vostro servizio, modificando il codice nel .svc file:

    <%@ ServiceHost Language="C#" Debug="true" Service="Api.Poll" Factory="Api.ServiceHostFactory" CodeBehind="Poll.svc.cs" %>
    • Il BaseAddress sezione del web.config è completamente ignorato quando ospitato in IIS. Non fa alcuna differenza avere presente o meno. IIS figure l’indirizzo in base alla configurazione della Directory Virtuale. stackoverflow.com/questions/56249/…
    • Hmm… io l’ho usato prima con IIS, ma che è stato uno scenario diverso, con più indirizzi di base. Mi chiedo se si potrebbe usare un ServiceHostFactory per impostare l’indirizzo di base a livello di programmazione. Vedere rivisto risposta.
    • Applausi per questo Steve… il Suo 9pm GMT qui quindi non posso dare a questo una prova quando torno in ufficio e tornare a domani. Si può solo chiarire dove ho creato questa classe. Devo solo inserirlo nella cartella App_Code e poi il mio Servizio di Estendere questo ?
    • Sì, si potrebbe semplicemente mettere in App_Code sezione, che sarebbe al lavoro. C’è un ultimo passaggio a filo fino, però, per fare questo è necessario modificare il markup della .svc file. Ho aggiornato la risposta di includere tale.
  4. 1

    Ecco come modificare l’intestazione in IIS7. Anche mettere il mio sito web.config per un po’, se aiuta.

    http://www.sslshopper.com/article-ssl-host-headers-in-iis-7.html

    <?xml version="1.0"?>
    <configuration>
      <system.web>
        <compilation debug="true" targetFramework="4.0" />      
        <customErrors mode="Off"></customErrors>
      </system.web> 
      <system.serviceModel>
        <client/>
        <services>
          <service name="WcfService1.Service1"
    behaviorConfiguration="MyServiceTypeBehaviors">
            <host>
            <baseAddresses>
              <add baseAddress="https://pws.sjukra.is/"/>        
            </baseAddresses>
            </host>
            <endpoint address="https://pws.sjukra.is/Service1.svc"
                      listenUri="/" 
            binding="wsHttpBinding"
            contract="WcfService1.IService1"
            bindingConfiguration="myBasicHttpBindingConfig"/>
            <endpoint contract="IMetadataExchange"
       binding="mexHttpsBinding"                   
       address="mex"/>
          </service>
        </services>
        <bindings>
          <wsHttpBinding>
            <binding name="myBasicHttpBindingConfig">
              <security mode="TransportWithMessageCredential">
                <transport clientCredentialType="Windows" />
                <message clientCredentialType="UserName"/>
              </security>
            </binding>
          </wsHttpBinding>
        </bindings>
        <behaviors>
          <serviceBehaviors>
            <behavior name="MyServiceTypeBehaviors">
              <serviceMetadata httpsGetEnabled="true"/>
              <serviceDebug httpsHelpPageEnabled="true" includeExceptionDetailInFaults="true"/>
              <serviceCredentials type="System.ServiceModel.Description.ServiceCredentials">
                <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="WcfService1.Service1,WcfService1"/>
                <serviceCertificate findValue="pws.sjukra.is" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
                  <clientCertificate>
                      <authentication certificateValidationMode="ChainTrust" revocationMode="NoCheck"/>
                  </clientCertificate>            
              </serviceCredentials>
            </behavior>
          </serviceBehaviors>
        </behaviors>
        <serviceHostingEnvironment multipleSiteBindingsEnabled="true"></serviceHostingEnvironment>
      </system.serviceModel>
      <system.webServer>
        <modules runAllManagedModulesForAllRequests="true"/>
      </system.webServer>
    </configuration>
  5. 1

    Anche se questo è un vecchio thread che è in realtà mi ha aiutato a eseguire la migrazione di un progetto da VS Web Developer Express per MonoDevelop che comprendeva un servizio WCF.

    L’applicazione web richiesto l’interfaccia JavaScript definito dal servizio WCF utilizzando il seguente URL: http://127.0.0.1:8080/path-to-service/service.svc/js, che mi ha dato l’errore: Nessun protocollo vincolante che corrisponde a un dato indirizzo

    Ispirato questo thread sono stato in grado di risolvere il problema, perché l’accesso al servizio con localhost invece di 127.0.0.1 lavorato! Con una richiesta di http://localhost:8080/path-to-service/service.svc/js ho avuto l’interfaccia JavaScript.

    In realtà la mia domanda non utilizzare un URL assoluto di includere l’interfaccia JavaScript, tuttavia, per impostazione predefinita all’avvio dell’applicazione da MonoDevelop permette di accedere all’applicazione utilizzando 127.0.0.1, così chiamata per includere JavaScript dal servizio non è riuscita.

    Ancora non è perfetto dal momento che non sono stato in grado di avviare l’applicazione da MonoDevelop usando localhost invece di 127.0.0.1, in quanto la configurazione per XSP solo mi permette di specificare un indirizzo IP, ma almeno so come ottenere intorno ad esso.

  6. 1

    Il problema è che dopo fare una modifica sulla porta o l’indirizzo ip si shold riavviare il pool di applicazioni che si utilizza, perché è ancora il vecchio informazioni fino riciclata.

Lascia un commento