2009-10-07 3 views
5

Ho un servizio Web ASP.NET su IIS, che funziona sulla porta 8080. Sulla porta 80 ho Apache, che sta reindirizzando alcuni siti Web in IIS.Il servizio Web ASP.NET cambia porta su Invoke

In questo caso, posso accedere alla pagina del servizio Web (http://example.com/service/), che mi fornisce tutti i metodi disponibili. Tuttavia, quando provo a invocare un metodo, si passa a una pagina Web come questa: http://example.com:8080/service/Service1.asmx/Method. Ovviamente un accesso pubblico non può vedere alcun risultato, la porta 8080 è bloccata e non può essere aperta.

Internamente, il servizio Web funziona sulla porta 8080, ma la richiesta del pubblico hanno bisogno di essere fatto per la porta 80.

Qualcuno sa come posso risolvere il mio problema?

PS: Utilizzo di IIS 7 e Apache 2.2 in Windows Server 2008

+0

Cosa url stai usando per ottenere il WSDL sul client? – Kev

risposta

3

La ragione più probabile di questo è che il servizio web generato WSDL definirà l'indirizzo del servizio endpoint come:

http://example.com:8080/service/service1.asmx

Si potrebbe fornire una definizione WSDL statica separata e modificare la sezione seguente per utilizzare la porta 80:

<wsdl:service name="Service1"> 
    <wsdl:port name="Service1Soap" binding="tns:Service1Soap"> 
     <soap:address location="http://example.com:8080/service/service1.asmxx" /> 
    </wsdl:port> 
    <wsdl:port name="Service1Soap12" binding="tns:Service1Soap12"> 
     <soap12:address location="http://example.com:8080/service/service1.asmx" /> 
    </wsdl:port> 
</wsdl:service> 

Ciò dovrebbe far sì che il client consumi WSDL e generi codice di stub per collegarsi alla porta corretta (che è il server Apache che funge da proxy).

Un altro metodo alternativo per imporre l'indirizzo corretto da visualizzare nel WDSL generato è usare un SoapExtensionReflector per modificare l'indirizzo location al volo:

Modify a Web Service's WSDL Using a SoapExtensionReflector

ho usato il sopra metodo con successo in passato.

In alternativa, è possibile, se il cliente è basato NET, sostituire l'URL di base per il servizio:

WebClientProtocol.Url Property (MSDN Library)

+0

Ho già implementato la soluzione SoapExtensionReflector. Potrebbe funzionare se si utilizza WSDL, ma in questo esempio sto utilizzando il client generato da ASP.NET, che tenta di utilizzare il servizio sulla porta 8080 ma non dispone delle autorizzazioni per farlo! –

+0

Quale URL stai usando per ottenere il WSDL sul client? – Kev

+0

Al momento, consumare il servizio Web utilizzando il file WSDL funziona correttamente, perché ho cambiato la porta sul WSDL. Tuttavia, l'interfaccia Web generata da ASP.NET non funziona perché continua a utilizzare la porta errata (8080). –