2016-04-23 22 views
1

Ich habe einen WebApi selbst gehosteten Konsolenserver über SSL.Consumer WebApi Self Host über SSL/TLS

Der Server kümmert sich um die Erstellung der SSL-Zertifikate, fügt sie zum Zertifikatsspeicher hinzu und bindet das Zertifikat unter Verwendung von netsh on the fly an den Port.

Der Server verfügt über einen einfachen Controller, der die Zeichenfolge "Hello World" über HTTP GET zurückgibt.

Browser is able to access the server

ich es über den Browser ohne Probleme zugreifen können, und ich bin ganz sicher, dass es nichts falsch mit dem Server-Code ist so bin ich nur den unruhigen Client-Code geht hier posten.

private static string url = @"https://localhost:4443/WebApi/Service/HelloWorld; 

private static async Task GetHelloWorldRequest(string url) 
    { 
     using (HttpClient httpClient = new HttpClient(GetSSLHandler())) 
     { 
      HttpRequestMessage request = new HttpRequestMessage(); 
      request.Method = HttpMethod.Get; 
      request.RequestUri = new Uri(url); 

      await httpClient 
       .SendAsync(request) 
       .ContinueWith((response) 
       => 
       { 
        try 
        { 
         ProcessResponse(response); 
        } 
        catch (AggregateException agException) 
        { 
         throw new Exception("Error getting response: " + agException.Message); 
        } 
       }).ConfigureAwait(false); 
     } 
    } 

    private static void ProcessResponse(Task<HttpResponseMessage> response) 
    { 
     Console.WriteLine(response.Result.Content.ReadAsStringAsync().Result); 
    } 

    private static void ProcessResponseHeaders(Task<HttpResponseMessage> response) 
    { 
     Console.WriteLine(response.Result.Headers.ToString()); 
    } 

private static WebRequestHandler GetSSLHandler() 
    { 
     WebRequestHandler handler = new WebRequestHandler(); 
     X509Certificate2 certificate = GetMyX509Certificate(); 
     handler.ClientCertificates.Add(certificate); 
     return handler; 
    } 

Jetzt in meiner Hauptroutine ich dies einfach anrufen:

Console.WriteLine("Response headers:"); 
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 
Task task = GetHelloWorldRequest(url); 
task.Wait(); 

Nun mein Problem, wenn ich versuche, den Antwortinhalt zu lesen, die ich „Hallo Welt“ geben soll es gibt mir eine leere Zeichenfolge stattdessen.

Also versuchte ich die Antwort-Header suchen, und das ist, was ich bekommen:

Response headers

Es es zu sein scheint durch die Verhandlungsphase gehen und ich weiß nicht, was hier zu tun .

Bitte um Rat. Vielen Dank im Voraus.

EDIT:

Leider ist das Problem mit dem Server-Code. Entkomme einfach den Abschnitt, der httpBinding.ConfigureTransportBindingElement aufruft.

class SslHttpsSelfHostConfiguration : HttpSelfHostConfiguration 
{ 
    public SslHttpsSelfHostConfiguration(string baseAddress) : base(baseAddress) { } 
    public SslHttpsSelfHostConfiguration(Uri baseAddress) : base(baseAddress) { } 

    protected override BindingParameterCollection OnConfigureBinding(HttpBinding httpBinding) 
    { 
    httpBinding.Security.Mode = HttpBindingSecurityMode.Transport; 
    /* 
    httpBinding.ConfigureTransportBindingElement = (element => 
     element.AuthenticationScheme = 
     AuthenticationSchemes.Negotiate); 
    */ 
    return base.OnConfigureBinding(httpBinding); 
    } 
} 

Antwort

1

Bitte versuchen Sie dies ausgeführt wird:

var client = new HttpClient 
{ 
    BaseAddress = new Uri("https://localhost:4443/") 
}; 
var result = await client.GetAsync("WebApi/Service/HelloWorld").ConfigureAwait(false); 
var data = await result.Content.ReadAsStringAsync().ConfigureAwait(false); 
return data; 

als Ihre Anfrage Aufgabe.

Und versuchen, den

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 

zu

ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true; 
+0

@schatchz ändern, sorry, aber ich bin immer noch eine leere Zeichenfolge statt "Hallo Welt" – superfly71

+0

@schlatchz, versuchte die Bearbeitung immer, aber immer noch kein Glück; ( – superfly71

+0

Das ist wirklich komisch ... Ich habe dies mit SSL-Servern getan und es hat funktioniert .. Können Sie bitte Ihren Server-Code hinzufügen? Speziell, wie Sie die Methode implementieren? – shlatchz