提供了无效的请求 URI。请求 URI 必须是绝对 URI,或者必须设置 BaseAddress。尝试使用网络服务

An invalid request URI was provided. The request URI must either be an absolute URI or BaseAddress must be set. trying to consuming a webservice

我正在尝试使用 .NET 中的 HttpClient 使用 Web 服务,在我完成 msdn

中提到的所有步骤之后

o 出现以下异常:提供了无效的请求 URI。请求 URI 必须是绝对 URI 或必须设置 BaseAddress。

这是我的class

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;
    }

}

}

我打赌您需要完整的 url 地址。使用 HttpClient 时,url 与调用方无关。

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

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

BaseAddress 在那里,因此您可以进行与 BaseAddress 相关的所有调用。它有效,您只需要了解 BaseAddress

的一些特性

但是你的问题是你在每个方法中都实例化了一个新的 HttpClient。

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;
}

更好的方法是将 HttpClient 调用包装在 class 中并将其放在构造函数中,然后在您的任何方法中共享它

    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()});
    }