首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >提供了一个无效的请求URI。请求URI必须是绝对URI,或者必须设置BaseAddress。尝试使用webservice

提供了一个无效的请求URI。请求URI必须是绝对URI,或者必须设置BaseAddress。尝试使用webservice
EN

Stack Overflow用户
提问于 2017-05-05 16:27:27
回答 2查看 15.5K关注 0票数 3

我试图在.NET中使用.NET来使用Web,在完成了msdn中提到的所有步骤之后

O获得以下异常:提供了无效的请求URI。请求URI必须是绝对URI,或者必须设置BaseAddress。

这是我的班

代码语言:javascript
运行
复制
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;
    }

}

}

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-05 17:00:42

BaseAddress在那里,这样您就可以进行相对于BaseAddress的所有调用。可以,您只需了解BaseAddress 为什么HttpClient BaseAddress不能工作?的一些特性即可。

但是,您的问题是在每个方法中实例化一个新的HttpClient。

代码语言:javascript
运行
复制
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调用封装在类中,并将其封装在构造函数中,然后在任何方法中共享它。

代码语言:javascript
运行
复制
    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()});
    }
票数 4
EN

Stack Overflow用户

发布于 2017-05-05 16:34:37

我打赌你需要完整的网址地址。当使用HttpClient时,url与调用方不相关。

代码语言:javascript
运行
复制
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;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43809746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档