2017-05-05 1 views
0

Ich versuche, einen Web-Service zu Verbrauchen Httpclient in .NET und nach habe ich alle genannten Schritte in msdnEin ungültiger Anforderungs-URI wurde angegeben. Der Anforderungs-URI muss entweder ein absoluter URI sein oder BaseAddress muss festgelegt sein. versuchen, eine Webservice raubend

o Holen Sie sich die folgende Ausnahme: Ein ungültiger Anforderungs-URI wurde zur Verfügung gestellt. Der Anforderungs-URI muss entweder ein absoluter URI sein oder BaseAddress muss festgelegt sein.

hier ist meine Klasse

public class Customer 
{ 
    public int id { get; set; } 
    public string id_default_group { get; set; } 
    public string id_lang { get; set; } 
    public string newsletter_date_add { get; set; } 
    public string ip_registration_newsletter { get; set; } 
    public string last_passwd_gen { get; set; } 
    public string secure_key { get; set; } 
    public string deleted { get; set; } 
    public string passwd { get; set; } 
    public string lastname { get; set; } 
    public string firstname { get; set; } 
    public string email { get; set; } 
    public string id_gender { get; set; } 
    public string birthday { get; set; } 
    public string newsletter { get; set; } 
    public string optin { get; set; } 
    public string website { get; set; } 
    public string company { get; set; } 
    public string siret { get; set; } 
    public string ape { get; set; } 
    public string outstanding_allow_amount { get; set; } 
    public string show_public_prices { get; set; } 
    public string id_risk { get; set; } 
    public string max_payment_days { get; set; } 
    public string active { get; set; } 
    public string note { get; set; } 
    public string is_guest { get; set; } 
    public string id_shop { get; set; } 
    public string id_shop_group { get; set; } 
    public string date_add { get; set; } 
    public string date_upd { get; set; } 
    public string reset_password_token { get; set; } 
    public string reset_password_validity { get; set; } 

} 

class Program 
{ 

    static void ShowProduct(Customer customer) 
    { 
     Console.WriteLine($"Email: {customer.email}\tFirst Name: {customer.firstname}"); 
    } 

    static async Task<Uri> CreateCustomerAsync(Customer customer) 
    { 
     HttpClient client = new HttpClient(); 
     HttpResponseMessage response = await client.PostAsJsonAsync("api/customers/1?output_format=JSON", customer); 
     response.EnsureSuccessStatusCode(); 

     // return URI of the created resource. 
     return response.Headers.Location; 
    } 
    static void Main() 
    { 
     RunAsync().Wait(); 
    } 
    static async Task RunAsync() 
    { 
     NetworkCredential hd = new NetworkCredential("INHFTLZLMLP1TUTJE7JL9LETCCEW63FN", ""); 
     HttpClientHandler handler = new HttpClientHandler {Credentials = hd }; 
     HttpClient client = new HttpClient(handler); 

     client.BaseAddress = new Uri("http://localhost:8080/newprestashop/"); 
     client.DefaultRequestHeaders.Accept.Clear(); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

      try 
      { 

       Customer customer = new Customer(); 
       var url = await CreateCustomerAsync(customer); 
       // Get the product 
       customer = await GetProductAsync(url.PathAndQuery); 
       ShowProduct(customer); 


      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.Message); 
      } 

      Console.ReadLine(); 
     } 

    static async Task<Customer> GetProductAsync(string path) 
    { 
     Customer customer = null; 
     HttpClient client = new HttpClient(); 
     HttpResponseMessage response = await client.GetAsync(path); 
     if (response.IsSuccessStatusCode) 
     { 
      customer = await response.Content.ReadAsAsync<Customer>(); 
     } 
     return customer; 
    } 

} 

}

+0

Sind Sie sicher, dass Ihre Web-Service ist und läuft bei http: // localhost: 8080? Ich würde das Web-API-Projekt starten und einen Unterbrechungspunkt am Anfang der Methode (Index) des Controllers (newprestashop) hinzufügen, den Sie zu treffen versuchen. Dann machen Sie Ihren Anruf von Ihrem Kunden. –

+0

ich Test in Post man es funktioniert gut –

Antwort

2

BaseAddress ist da, damit Sie alle Anrufe relativ zur BaseAddress vornehmen können. Es funktioniert, Sie müssen nur einige der Idiosynkrasien von BaseAddress kennen Why is HttpClient BaseAddress not working?

Aber Ihr Problem ist, dass Sie einen neuen HttpClient in jeder Methode instanziieren.

static async Task<Uri> CreateCustomerAsync(Customer customer) 
{ 
    HttpClient client = new HttpClient(); 
    //you never set the BaseAddress 
    //or the authentication information 
    //before making a call to a relative url! 
    HttpResponseMessage response = await client.PostAsJsonAsync("api/customers/1?output_format=JSON", customer); 
    response.EnsureSuccessStatusCode(); 

    // return URI of the created resource. 
    return response.Headers.Location; 
} 

Eine bessere Möglichkeit, die Httpclient Anruf in einer Klasse und es nach oben in den Konstruktor zu wickeln wäre, dann

in Ihren Methoden teilen
public WrapperClass(Uri url, string username, string password, string proxyUrl = "") 
    { 
     if (url == null) 
      // ReSharper disable once UseNameofExpression 
      throw new ArgumentNullException("url"); 
     if (string.IsNullOrWhiteSpace(username)) 
      // ReSharper disable once UseNameofExpression 
      throw new ArgumentNullException("username"); 
     if (string.IsNullOrWhiteSpace(password)) 
      // ReSharper disable once UseNameofExpression 
      throw new ArgumentNullException("password"); 
     //or set your credentials in the HttpClientHandler 
     var authenticationHeaderValue = new AuthenticationHeaderValue("Basic", 
      // ReSharper disable once UseStringInterpolation 
      Convert.ToBase64String(Encoding.UTF8.GetBytes(string.Format("{0}:{1}", username, password)))); 

     _httpClient = string.IsNullOrWhiteSpace(proxyUrl) 
      ? new HttpClient 
      { 
       DefaultRequestHeaders = { Authorization = authenticationHeaderValue }, 
       BaseAddress = url 
      } 
      : new HttpClient(new HttpClientHandler 
      { 
       UseProxy = true, 
       Proxy = new WebProxy 
       { 
        Address = new Uri(proxyUrl), 
        BypassProxyOnLocal = false, 
        UseDefaultCredentials = true 
       } 
      }) 
      { 
       DefaultRequestHeaders = { Authorization = authenticationHeaderValue }, 
       BaseAddress = url 
      }; 

     _httpClient.DefaultRequestHeaders.Accept.Clear(); 
     _httpClient.DefaultRequestHeaders.AcceptEncoding.Clear(); 
     _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
    } 

    public async Task<Member> SomeCallToHttpClient(string organizationId) 
    { 
     var task = await _httpClient.GetStringAsync(<your relative url>)); 

     return JsonConvert.DeserializeObject<SomeType>(task, 
      new JsonSerializerSettings {ContractResolver = new CamelCasePropertyNamesContractResolver()}); 
    } 
+0

Vielen Dank so sehr –

2

Ich wette, Sie die vollständige URL-Adresse benötigen. Die URL ist nicht relativ zum Aufrufer, wenn Sie HttpClient verwenden.

+0

funktioniert super die Ausnahme ist weg, aber es gibt eine andere "Response-Status-Code zeigt nicht Erfolg: 401 (nicht autorisiert)." –

+0

Das bedeutet, dass Sie sich authentifizieren müssen, bevor Sie Ihren API-Anruf tätigen. Der Endpunkt wurde erreicht und wegen fehlender Autorisierung abgelehnt. –

+0

Ihr Autorisierungsproblem ist das gleiche Problem wie Ihre BaseAddress. Sie instanziieren HttpClient und legen die Werte nie fest. Siehe meine Antwort. – Fran

Verwandte Themen