2013-04-26 21 views
15

Ho una pagina di servizio WCF che esegue solo WebGets/WebInvokes su SSL - funziona perfettamente sul mio computer locale (certificato autofirmato). In produzione, tuttavia, posso raggiungere service.svc (e mi dà il messaggio su come consumare) ma service.svc/AnyRequest restituisce un 404. Entrambi gli ambienti sono ospitati in IIS 7.5.Servizio WCF restituisce 404 su richieste di metodo

Ho abilitato la traccia e il servizio non sta nemmeno prelevando nessuna delle richieste del metodo (ad esempio service.svc/SomeRequest), tuttavia sta elaborando correttamente service.svc. Sta anche ascoltando allo https://computername.domain.net/path/service.svc - è normale? Dovrebbe normalmente puntare a https://publicfacing.com/path/service.svc?

Si noti inoltre che il server di produzione ospita più siti all'interno di IIS.

Di seguito è la sezione system.serviceModel del mio web.config. Lo SSLBehave è stato suggerito da here.

<system.serviceModel> 
    <bindings> 
     <webHttpBinding> 
     <binding name="TransportSecurity"> 
      <security mode="Transport"> 
      <transport clientCredentialType="None"></transport> 
      </security> 
     </binding> 
     </webHttpBinding> 
    </bindings> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="SSLBehave"> 
      <useRequestHeadersForMetadataAddress> 
      <defaultPorts> 
       <add scheme="https" port="443"/> 
      </defaultPorts> 
      </useRequestHeadersForMetadataAddress> 
     </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
     <behavior name="UserManagement.ajaxAspNetAjaxBehavior"> 
      <webHttp defaultOutgoingResponseFormat="Json" defaultBodyStyle="Wrapped" /> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" 
     multipleSiteBindingsEnabled="true" /> 
    <services> 
     <service name="UserManagement.ajax" behaviorConfiguration="SSLBehave"> 
     <endpoint address="" behaviorConfiguration="UserManagement.ajaxAspNetAjaxBehavior" 
      binding="webHttpBinding" bindingConfiguration="TransportSecurity" contract="UserManagement.ajax" /> 
     </service> 
    </services> 
    </system.serviceModel> 
+0

il servizio funziona se richiamato localmente? – theusguy

+0

@theusguy Negativo, che restituisce ancora 404. – Snuffleupagus

+0

Se il problema persiste, la mia risposta potrebbe aiutarti –

risposta

9

Vorrei iniziare controllando un numero di cose;

  • Autorizzazioni nella directory ospitata?
  • . La versione Net è corretta?
  • Hai aggiunto il certificato al sito?
  • Prova a mettere un'immagine nello stesso percorso, si può passare a quello (escludere le dispari mappature del percorso occasionali)

Buona fortuna!

+0

Anche se questo non ha risolto il mio problema, la maggior parte di questi sono la soluzione migliore per chiunque cerchi una soluzione. Goditi la taglia. :) – Snuffleupagus

+2

ElatedOwl, se hai risolto il problema, per favore pubblica la tua risposta. – MGOwen

+1

Per chiunque trovasse questo, ho avuto un problema simile, ecco la mia domanda, completa con la ** soluzione **: http://stackoverflow.com/questions/26398049 – MGOwen

5

Ho avuto lo stesso problema. Da quello che ho letto, WCF non è un'autenticazione NT autenticata (o compatibile con HTTPContext) per impostazione predefinita.

ho dovuto aggiungere questo al mio file di configurazione per il web.config servizio WCF nella sezione:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 

Che hai fatto, oltre a questo:

E sul servizio effettivo di classe I definiation ha dovuto aggiungere:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class DataService : IDataDeliveryServiceContract 

Questo problema risolto.

+0

hey ho aggiunto il tag nel file WCF.config e attributo anche in il servizio come hai detto ma ancora quando sto ricevendo errore e errore di navigazione incrociata. – user3217843

5

È possibile implementare la sicurezza del livello di trasporto utilizzando i collegamenti WsHttp. Vedi this article; nei vostri attacchi provare questo Biding invece:

<wsHttpBinding> 
<binding name="TransportSecurity"> 
<security mode="Transport"> 
<transport clientCredentialType="None"/> 
</security> 
</binding> 
</wsHttpBinding> 

L'articolo cita si dovrebbe legare le associazioni con i punti finali.

4

Come accennato, è possibile accedere al servizio dall'estensione .svc service.svc ma non nel formato REST service.svc/AnyRequest, il problema deve essere routing integration.

aggiungere questo alla tua web.config

<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> 

In IIS 6 La causa di questo errore deve essere Check that file exists cornice di SVC estensione, assicurarsi "Verificare che il file esiste è selezionata". Per ulteriori informazioni, vedere IIS Hosted Service Fails.

5

Forse nei tuoi RouteConfig.cs SCHEDA aggiungi questa linea:

routes.IgnoreRoute("{resource}.svc/{*pathInfo}"); 

Finché il file .svc è nella root dell'applicazione.

+0

Questa risposta è molto utile quando si tenta di chiamare il 'WCF Service' direttamente dall'app MVC. Stavo ricevendo il '404 - Not Found error' per jquery post request. Ora risolto, questo mi ha aiutato.:) – RajeshKdev

1

La prima cosa che faccio quando ottengo un 404 con un servizio Web WCF appena sviluppato è il controllo del mapping del gestore richiesto per interpretare questo tipo di chiamata, perché spesso è la causa del problema. Esistono diversi modi per aggirare il problema, molti dei quali richiedono l'esecuzione manuale del comando console ServiceModelReg.exe: si tratta di procedure sicuramente valide ma che potrebbero anche non funzionare - o di creare ulteriori problemi - se la macchina di sviluppo ha una configurazione particolarmente complessa. Il metodo di risoluzione che propongo di seguito è leggermente più lungo da estrarre, ma ha il vantaggio di risolvere il problema in modo più sicuro e sicuro.

  • Aprire l'interfaccia Server Manager per la gestione della macchina, di solito presente in entrambi barra del e il menu di avvio .
  • Andare al pannello Dashboard e selezionare Aggiungi ruolo o funzione per aprire la procedura guidata.
  • Selezionare il tipo di installazione basato su ruoli o funzione e il server su cui si desidera lavorare, ovvero il server locale/locale.
  • Vai Caratteristiche sezione: Una volta lì, espandere la .NET Framework 3.5 Caratteristiche nodi e/o la .NET Framework 3.5 Caratteristiche nodo, a seconda di ciò che si è installato: se si dispone di entrambi, dovrebbe eseguire il seguente passaggio due volte (per ognuno di essi).
  • Espandere la sezione Servizi WCF (se disponibile), quindi selezionare Attivazione HTTP (vedere la schermata seguente).
  • Continuare fino a completare la procedura guidata, quindi fare clic su Installa.

enter image description here

Una volta completata l'installazione, si dovrebbe essere in grado di eseguire il servizio WCF senza incorrere nell'errore 404 mai più.

Per ulteriori informazioni su questo specifico problema e su come risolverlo, è possibile anche read the following post.

Problemi correlati