2017-12-29 27 views
1

Wir haben onpremise Web-Service (asp.net Core mvc) auf lokalen Netzwerk-Rechner bereitgestellt. Wir versuchen, diese WEB-API mithilfe des auf Azure bereitgestellten App-Service aufzurufen. Aber es gibt Timeout-Fehler oder Task wurde abgebrochen Fehler im Fall, wenn wir versuchen, es mit "HTTP" -Protokoll verbinden. Im Falle von "HTTPS" gibt es "Sicherheitsfehler aufgetreten Fehler".Azure-Web-App-Dienst zum Aufruf onpremise WEB API unter Verwendung von HttpClient mit Hybrid-Verbindungs-Manager

Wir haben eine hybride Verbindung im Azure App Service erstellt, um eine Verbindung zum onpremise Web-API-Dienst herzustellen, der sowohl für den 80 als auch den 443 Port online angezeigt wird. Wir haben den Hybrid Connection Manager auch auf dem lokalen Netzwerkcomputer eingerichtet.

Unten ist der Code-Snippet für Code aufrufen, die auf Azure App-Service bereitgestellt wird (z https://xyz.azurewebsite.com)

try 
{ 
    var httpClient = new HttpClient(); 
    httpClient.Timeout = TimeSpan.FromMinutes(60); 
    httpClient.BaseAddress = new Uri("https://onpremise"); 
    httpClient.DefaultRequestHeaders.Accept.Clear(); 
    httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; 
    ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true; 
    //Simple Get Request to test on-premise service 
    var response = await httpClient.GetStringAsync("api/OnPremiseData/GetData"); 
    ViewBag.ResponseText = response; 
} 

Above Code funktioniert gut, falls ich Anwendung debuggen von localhost. Es gibt also kein Problem mit Code, den ich vermute.

Im Folgenden finden Sie web api Code-Schnipsel:

[Route("api/[controller]/[action]")] 
public class OnPremiseDataController : Controller 
{   
    [HttpGet] 
    public string GetData() 
    { 
    return "Success"; 
    } 
} 

und unten ist startup.cs Datei

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddCors(); 
    services.AddMvc();    
} 
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. 
public void Configure(IApplicationBuilder app, IHostingEnvironment env) 
{ 
    app.UseCors(options => options.WithOrigins("https://xyz.azurewebsite.com", "https://localhost:44310").AllowAnyMethod().AllowAnyHeader()); 
    if (env.IsDevelopment()) 
    { 
    app.UseDeveloperExceptionPage(); 
    }    
    app.UseMvc();     
} 

Antwort

1

Unten ist die Lösung für obige Frage. Grundsätzlich habe ich 2 Problem gelöst.

Zuerst wird FQDN (vollqualifizierter Domänenname) verwendet. Ich kann eine Verbindung zu Vor-Ort-Diensten herstellen. Stellen Sie sicher, dass Sie verwenden, FQDN beim Konfigurieren Endpunkt in Hybridverbindung auf Azure verwenden.

Zweitens unter Codezeile verwenden Ich bin in der Lage sichere HTTPS-ot On-Premise-Server anfordern zu machen:

HttpMessageHandler handler = new HttpClientHandler 
    { 
     SslProtocols = System.Security.Authentication.SslProtocols.Tls12 | System.Security.Authentication.SslProtocols.Tls11 | System.Security.Authentication.SslProtocols.Tls, 
     ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true 
    }; 

Unten finden Komplettlösung von oben Problem:

HttpMessageHandler handler = new HttpClientHandler 
        { 
         SslProtocols = System.Security.Authentication.SslProtocols.Tls12 | System.Security.Authentication.SslProtocols.Tls11 | System.Security.Authentication.SslProtocols.Tls, 
         ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true 
        }; 
var httpClient = new HttpClient(handler); 
    httpClient.Timeout = TimeSpan.FromMinutes(60); 
     httpClient.BaseAddress = new Uri("https://onpremise"); 
     httpClient.DefaultRequestHeaders.Accept.Clear(); 
     httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
     //Simple Get Request to test on-premise service 
     var response = await httpClient.GetStringAsync("api/OnPremiseData/GetData"); 
     ViewBag.ResponseText = response; 
1

Wir hatten ähnliches Szenario (WebApp und SQL on-premise) und der Trick war zu verwenden, vollständig qualifizierter Domänenname des Endpunkts im Hybrid Connection Manager auf dem lokalen Computer.

+0

Ich glaube, ich bin Verbindung zum SQL Server nur durch Erwähnen des Endpunkts herstellen. Z.B. tcp: onlyhostname, 1433 in der Verbindungszeichenfolge. Irgendeine Idee, wie man Ruhe API in ähnlicher Weise verbindet? Ich muss es mit einem vollständig qualifizierten Namen versuchen. Ich hoffe, es wird funktionieren. –

+0

Unsere Verbindung war ebenfalls erfolgreich, aber die Anforderungen wurden erst erfüllt, als der Endpunkt der FQDN war. –

+0

Ja. FQDN funktioniert für mich !! aber nur für HTTP nicht für HTTPS. Wenn ich HTTPS verwende, wird "Ein Sicherheitsfehler ist aufgetreten" angezeigt. –

Verwandte Themen