0

我正在学习如何在我的本地主机上使用 Visual Studio 2012 连接到 ASP.NET Web API 服务。

这是示例 Web API 控制器:

namespace ProductStore.Controllers
{
public class ProductsController : ApiController
{
    static readonly IProductRepository repository = new ProductRepository();

    public IEnumerable<Product> GetAllProducts()
    {
        return repository.GetAll();
    }

    public Product GetProduct(int id)
    {
        Product item = repository.Get(id);
        if (item == null)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
        return item;
    }

    public IEnumerable<Product> GetProductsByCategory(string category)
    {
        return repository.GetAll().Where(
            p => string.Equals(p.Category, category, StringComparison.OrdinalIgnoreCase));
    }

    public HttpResponseMessage PostProduct(Product item)
    {
        item = repository.Add(item);
        var response = Request.CreateResponse<Product>(HttpStatusCode.Created, item);

        string uri = Url.Link("DefaultApi", new { id = item.Id });
        response.Headers.Location = new Uri(uri);
        return response;
    }

    public void PutProduct(int id, Product product)
    {
        product.Id = id;
        if (!repository.Update(product))
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
    }

    public void DeleteProduct(int id)
    {
        repository.Remove(id);
    }
}
}

我正在尝试使用以下代码连接到此 Web API:

static async Task RunAsyncGet()
{
    try
    {
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("http://localhost:9000/");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            // HTTP GET
            HttpResponseMessage response = await client.GetAsync("/api/product/1");
            if (response.IsSuccessStatusCode)
            {
                Product product = await response.Content.ReadAsAsync<Product>();
                Console.WriteLine("{0}\t${1}\t{2}", product.Name, product.Price, product.Category);
            }
        }
    }
    catch (Exception ex)
    {         
        throw;
    }
}

我在 App.config 中有以下内容(我在网上找到了这个):

<system.net>
<defaultProxy enabled="false" useDefaultCredentials="false">
  <proxy/>
  <bypasslist/>
  <module/>
</defaultProxy>
</system.net>

执行此行时,应用程序停止执行:

HttpResponseMessage response = await client.GetAsync("api/products/1");

什么会导致这种情况?

提前致谢

编辑

这是错误:

System.Net.Http.HttpRequestException was caught   HResult=-2146233088  Message=An error occurred while sending the request.   Source=mscorlib StackTrace:
       at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
       at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
       at ProductStoreClientFormsApplication.Form1.<RunAsyncGet>d__0.MoveNext() in h:\Learning\WEB API\ProductStoreClientFormsApplication\ProductStoreClientFormsApplication\Form1.cs:line 33   InnerException: System.Net.WebException
       HResult=-2146233079
       Message=The underlying connection was closed: Unable to connect to the remote server.
       Source=System
       StackTrace:
            at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
            at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)
       InnerException: System.Net.Sockets.SocketException
            HResult=-2147467259
            Message=An invalid argument was supplied
            Source=System
            ErrorCode=10022
            NativeErrorCode=10022
            StackTrace:
                 at System.Net.Sockets.Socket..ctor(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType)
                 at System.Net.ServicePoint.GetConnection(PooledStream PooledStream, Object owner, Boolean async, IPAddress& address, Socket& abortSocket, Socket& abortSocket6)
                 at System.Net.PooledStream.Activate(Object owningObject, Boolean async, GeneralAsyncDelegate asyncCallback)
                 at System.Net.Connection.CompleteStartConnection(Boolean async, HttpWebRequest httpWebRequest)
            InnerException:
4

2 回答 2

1

我看到您正在使用从 ASP.NET Web API 2 (C#) 中的 .NET 客户端调用 Web API中的控制台应用程序示例

我需要做同样的事情,但是在一个 Windows 应用程序中,我通过做两件事来解决它。在我的 Click 事件中(并且应该与调用函数相同)不要使用 .Wait()。使用 Async 修饰符标记事件/函数并使用 await 调用异步方法

private async void btnSave_Click(object sender, EventArgs e)
{
        await RunAsyncGet();
}

将 RunAsync 方法从 static 更改为 private 。

  private async Task RunAsyncGet()
    {
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("http://localhost:56286/");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            // HTTP GET
            HttpResponseMessage response = await client.GetAsync("/api/product/1");
            if (response.IsSuccessStatusCode)
            {
                Product product= await response.Content.ReadAsAsync<Product>();
                SomeLabel.Text = product.Username;

            }
        }
    }

调用将运行并完成,而应用程序不会停止。将 RunAsync 方法更改为私有后,您将可以访问应用程序上的所有控件,并使用来自 HTTPClient 的响应,例如显示消息/或更新标签或网格等。

于 2016-06-09T11:12:56.930 回答
0

There are a couple of possible problems.

I believe the most likely cause is in your client code; I suspect that further up you call stack, your code is calling Wait or Result on the task returned from an async method. This will cause a deadlock, as I describe on my blog. The solution is to replace all calls to Task.Wait or Task<T>.Result with await and allow async to grow naturally.

If that isn't the case, there is one other thing to check (actually, it's a good idea to check this even if the paragraph above solves the problem). On the server side, ensure that your ASP.NET app is targeting .NET 4.5 and has httpRuntime.targetFramework set to 4.5 in its web.config.

于 2014-04-14T13:02:35.657 回答