2009-10-07 16 views
5

Mam usługę sieci Web ASP.NET na IIS, która działa na porcie 8080. Na porcie 80 mam Apache, czyli przekierowuję niektóre witryny do usług IIS.ASP.NET Web Service zmienia port na Invoke

W tym przypadku mogę uzyskać dostęp do strony usługi sieci Web (http://example.com/service/), która udostępnia wszystkie dostępne metody. Jednak gdy próbuję wywołać metodę, przechodzi do strony internetowej takiej jak ta: http://example.com:8080/service/Service1.asmx/Method. Oczywiście, że publiczny dostęp nie może zobaczyć żadnego wyniku, port 8080 jest zablokowany i nie można go otworzyć.

Wewnętrznie Web Service działa na porcie 8080, ale wniosek publicznego muszą być wykonane do portu 80.

ktoś wie w jaki sposób mogę rozwiązać mój problem?

PS: Korzystanie IIS 7 i Apache 2.2 w systemie Windows Server 2008

+0

Co url używasz, aby uzyskać WSDL na kliencie? – Kev

Odpowiedz

3

Najbardziej prawdopodobnym powodem jest to, że serwis internetowy generowane WSDL definiuje adres punktu końcowego usługi jak:

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

Można podać osobną statyczną definicję WSDL i zmodyfikować następującą sekcję, aby używać portu 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> 

Powinno to spowodować, że klient zużyje WSDL i wygeneruje kod pośredniczący w celu powiązania z odpowiednim portem (który jest serwerem Apache działającym jako proxy).

Kolejny alternatywny sposób, aby wymusić prawidłowy adres pojawiać w generowanym WDSL jest użycie SoapExtensionReflector zmodyfikować adres location w locie:

Modify a Web Service's WSDL Using a SoapExtensionReflector

I używany przede metoda z powodzeniem w przeszłości.

Alternatywnie, można, jeśli klient jest oparta .NET przesłonić bazowy URL dla usługi:

WebClientProtocol.Url Property (MSDN Library)

+0

Mam już zaimplementowane rozwiązanie SoapExtensionReflector. Mogłoby to działać, gdybyś używał WSDL, ale na tym przykładzie korzystam z klienta wygenerowanego z ASP.NET, który próbuje korzystać z usługi na porcie 8080, ale nie ma uprawnień do jej wykonania! –

+0

Jaki adres URL używasz do uzyskania WSDL na kliencie? – Kev

+0

W tej chwili korzystanie z usługi WWW przy użyciu pliku WSDL działa dobrze, ponieważ zmieniłem port w WSDL. Jednak interfejs sieciowy generowany przez program ASP.NET nie działa, ponieważ nadal używa niewłaściwego portu (8080). –