【问题标题】:Calling a local WebAPI from a local MVC site从本地 MVC 站点调用本地 WebAPI
【发布时间】:2014-07-31 23:26:02
【问题描述】:

我已经使用 Windows 身份验证 在我的本地计算机上创建了一个 WebAPI 应用程序。

我还创建了一个 MVC 5 应用程序,并尝试使用以下代码连接到我的 WebAPI:

using (var client = new HttpClient())
{
    client.BaseAddress = new Uri("http://localhost:52613/api/acmeco/");
    var result = client.GetAsync("assignees/get").Result;
    string resultContent = result.Content.ReadAsStringAsync().Result;

    JavaScriptSerializer json_serializer = new JavaScriptSerializer();
    assignees = json_serializer.DeserializeObject(resultContent);
}

问题是:每次我尝试通过 MVC 5 应用程序或 Fiddler 进行连接时,都会收到 401 Unauthorized 错误。

我已经尝试了多种解决方案来解决这个问题,包括但不限于以下:

http://support.microsoft.com/kb/896861/en-us

有谁知道我如何从本地 MVC 5 应用调用本地 WebAPI?

编辑:我也尝试像这样将 CORS(跨域脚本)添加到 WebAPI,但似乎对 401 错误没有影响:

[EnableCors(origins: "*", headers: "*", methods: "*")]
public class AssigneesController : ApiController
{
    public Assignees AssigneeRepo = new Assignees();

    // GET api/values
    public IEnumerable<Assignee> Get(string @namespace)
    {
        return AssigneeRepo.GetAssigneesForTenant(@namespace);
    }
}

但是,我可以直接从浏览器访问 localhost:52613/api/acmeco/assignees/get。

【问题讨论】:

  • HTTP 401 表示您未获得授权。 WebApi 上是否有身份验证?
  • @DavidG 是的,它使用 Windows 身份验证。我可以直接从浏览器调用我的 WebAPI,它可以工作。但是,从 Fiddler 或本地 MVC 5 应用程序调用,它给了我一个 401。
  • 您是否尝试过传入 Windows 凭据?检查这个 - stackoverflow.com/questions/11608843/error-401-in-c-sharp
  • @user1477388 您的浏览器会选择运行它的 Windows 帐户,但是当您创建 HttpClient 时,您需要手动传递它。如果来自 Gabbar 的链接不起作用,那么还有很多其他网站应该会告诉您如何操作。
  • @Gabbar 感谢 Gabbar。该链接不是确切的答案,我不得不对其进行一些修改,但基本上就是这样。

标签: c# asp.net-web-api asp.net-mvc-5


【解决方案1】:

你可以试试:

        HttpClientHandler handler = new HttpClientHandler()
        {
            UseDefaultCredentials = true
        };

    using(HttpClient client = new HttpClient(handler))
   {     
      client.BaseAddress = new Uri("http://localhost:52613/api/acmeco/");
      var result = client.GetAsync("assignees/get").Result;
      string resultContent = result.Content.ReadAsStringAsync().Result;

      JavaScriptSerializer json_serializer = new JavaScriptSerializer();
      assignees = json_serializer.DeserializeObject(resultContent);
  }

【讨论】:

  • 太好了,我更喜欢你的想法。谢谢。
【解决方案2】:

正如上面@Gabbar 的链接所暗示的,我需要使用NetworkCredentials。我按如下方式实现了它并且它有效:

public ActionResult Index()
{
    var assignees = new object();

    using (var handler = new HttpClientHandler()) 
    {
        handler.Credentials = new System.Net.NetworkCredential(@"DOMAIN\USERNAME", "PASSWORD");
        using (var client = new HttpClient(handler))
        {
            client.BaseAddress = new Uri("http://localhost:52613/api/acmeco/");
            var result = client.GetAsync("assignees/get").Result;
            string resultContent = result.Content.ReadAsStringAsync().Result;

            JavaScriptSerializer json_serializer = new JavaScriptSerializer();
            assignees = json_serializer.DeserializeObject(resultContent);
        }
    }
    return View(assignees);
}

【讨论】:

    猜你喜欢
    • 2014-05-13
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2016-07-10
    • 2023-03-10
    • 1970-01-01
    • 2014-08-24
    • 1970-01-01
    相关资源
    最近更新 更多