标签: asp.net-web-api

如何让HttpClient与请求一起传递凭据?

我有一个与Windows服务对话的Web应用程序(在IIS中托管).Windows服务使用ASP.Net MVC Web API(自托管),因此可以使用JSON通过http进行通信.Web应用程序配置为进行模拟,其想法是向Web应用程序发出请求的用户应该是Web应用程序用来向服务发出请求的用户.结构如下所示:

(以红色突出显示的用户是以下示例中引用的用户.)


Web应用程序使用以下命令向Windows服务发出请求HttpClient:

var httpClient = new HttpClient(new HttpClientHandler() 
                      {
                          UseDefaultCredentials = true
                      });
httpClient.GetStringAsync("http://localhost/some/endpoint/");
Run Code Online (Sandbox Code Playgroud)

这会向Windows服务发出请求,但不会正确传递凭据(服务将用户报告为IIS APPPOOL\ASP.NET 4.0).这不是我想要发生的事情.

如果我将上述代码更改为使用WebClient,则会正确传递用户的凭据:

WebClient c = new WebClient
                   {
                       UseDefaultCredentials = true
                   };
c.DownloadStringAsync(new Uri("http://localhost/some/endpoint/"));
Run Code Online (Sandbox Code Playgroud)

使用上述代码,服务将用户报告为向Web应用程序发出请求的用户.

我执行错误HttpClient导致它无法正确传递凭据(或者它是一个错误HttpClient),我做错了什么

我想使用HttpClient它的原因是它有一个与s兼容的异步API Task,而WebClientasyc API需要用事件处理.

c# impersonation windows-security asp.net-web-api

153
推荐指数
6
解决办法
19万
查看次数

在WebAPI客户端中每次调用创建一个新的HttpClient的开销是多少?

HttpClientWebAPI客户端的生命周期应该是多少?为多个调用
设置一个实例是否更好HttpClient

创建和处理HttpClient每个请求的开销是多少,如下面的示例所示(摘自http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from- a-net-client):

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

    // New code:
    HttpResponseMessage response = await client.GetAsync("api/products/1");
    if (response.IsSuccessStatusCode)
    {
        Product product = await response.Content.ReadAsAsync<Product>();
        Console.WriteLine("{0}\t${1}\t{2}", product.Name, product.Price, product.Category);
    }
}
Run Code Online (Sandbox Code Playgroud)

c# asp.net web-services asp.net-web-api dotnet-httpclient

152
推荐指数
4
解决办法
6万
查看次数

ASP.NET Web API中的用户身份验证

这个话题令我难以置信.我是HTTP应用程序的新手,但需要开发一个消费来自某个地方的JSON数据的iPhone客户端.我选择了MS的Web API,因为它似乎很容易,但是当涉及到对用户进行身份验证时,事情变得非常令人沮丧.

令我惊讶的是,在几个小时的Google搜索后Authorize,我无法找到一个明确的示例,说明如何从登录屏幕向下验证用户,直到使用我的ApiController方法中的属性.

这不是一个问题,而是一个如何准确执行此操作的示例请求.我看过以下几页:

尽管这些解释了如何处理未经授权的请求,但这些请求并没有明确地表明类似于某种类似的LoginController东西,要求用户凭据并验证它们.

有谁愿意写一个很好的简单例子或指出我正确的方向,拜托?

谢谢.

asp.net asp.net-web-api

148
推荐指数
3
解决办法
12万
查看次数

将Http Headers添加到HttpClient

所有:

在向Web服务发送请求之前,我需要将http标头添加到HttpClient.我如何为单个请求执行此操作(而不是将HttpClient应用于所有将来的请求)?我不确定这是否可行.

var client = new HttpClient();
var task =
    client.GetAsync("http://www.someURI.com")
    .ContinueWith((taskwithmsg) =>
    {
        var response = taskwithmsg.Result;

        var jsonTask = response.Content.ReadAsAsync<JsonObject>();
        jsonTask.Wait();
        var jsonObject = jsonTask.Result;
    });
task.Wait();
Run Code Online (Sandbox Code Playgroud)

c# asp.net-web-api dotnet-httpclient

147
推荐指数
2
解决办法
13万
查看次数

使用HttpClient进行Https调用

我一直在HttpClient使用C#进行WebApi调用.似乎比较简洁快捷WebClient.但是我在Https打电话时被困住了.

如何制作以下代码才能Https拨打电话?

HttpClient httpClient = new HttpClient();
httpClient.BaseAddress = new Uri("https://foobar.com/");
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(
                new MediaTypeWithQualityHeaderValue("application/xml"));

var task = httpClient.PostAsXmlAsync<DeviceRequest>(
                "api/SaveData", request);
Run Code Online (Sandbox Code Playgroud)

编辑1: 上面的代码适用于进行http调用.但是,当我将方案更改为https时,它不起作用.这是获得的错误:

底层连接已关闭:无法为SSL/TLS安全通道建立信任关系.

编辑2: 将方案更改为https是:第一步.

如何提供证书和公钥/私钥以及C#请求.

c# asp.net-web-api

146
推荐指数
6
解决办法
23万
查看次数

使用Request.CreateResponse进行ASP.NET WebApi单元测试

我正在尝试为我的ApiController编写一些单元测试并遇到一些问题.有一个很好的扩展方法叫做Request.CreateResponse,可以帮助生成响应.

public HttpResponseMessage Post(Product product)
{
  var createdProduct = repo.Add(product);
  return this.Request.CreateResponse(HttpStatusCode.Created, createdProduct);
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在不使用部分模拟或直接使用"new HttpResponseMessage(...)"的情况下模拟CreateResponse?

c# unit-testing mocking httpresponse asp.net-web-api

144
推荐指数
3
解决办法
5万
查看次数

如何在Web API消息处理程序中提取自定义标头值?

我目前在我的Web API服务中有一个消息处理程序,它覆盖"SendAsync",如下所示:

protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
  //implementation
}
Run Code Online (Sandbox Code Playgroud)

在此代码中,我需要检查名为的自定义添加的请求标头值MyCustomID.问题是当我执行以下操作时:

if (request.Headers.Contains("MyCustomID"))  //OK
    var id = request.Headers["MyCustomID"];  //build error - not OK
Run Code Online (Sandbox Code Playgroud)

...我收到以下错误消息:

无法将带有[]的索引应用于"System.Net.Http.Headers.HttpRequestHeaders"类型的表达式

如何通过传递给此重写方法的(MSDN文档)实例访问单个自定义请求标头?HttpRequestMessage

c# httprequest asp.net-web-api

143
推荐指数
7
解决办法
19万
查看次数

在Web API 2和.NET 4.5.1迁移之后,GlobalConfiguration.Configure()不存在

我最近开始按照本指南将我的项目迁移到.NET 4.5.1和Web Api 2.

MS开发人员Rick Anderson要求你做的第一件事就是改变:

WebApiConfig.Register(GlobalConfiguration.Configuration);
Run Code Online (Sandbox Code Playgroud)

GlobalConfiguration.Configure(WebApiConfig.Register);
Run Code Online (Sandbox Code Playgroud)

在global.asax文件中.然而,当我尝试构建时,这给了我一个错误:

错误1'System.Web.Http.GlobalConfiguration'不包含'Configure'的定义

我的项目目前是MVC 5和Web Api 2和.NET 4.5.1,但我认为System.Web.Http仍然认为它是.NEt 4.0版本.

我该怎么办呢?

谢谢.

编辑:

这是我的程序集绑定:

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="System.Net.Http.Formatting" publicKeyToken="31BF3856AD364E35" culture="neutral"/>
    <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0"/>
  </dependentAssembly>
  <!--
  <dependentAssembly>
    <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35"/>
    <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/>
    <bindingRedirect oldVersion="1.0.0.0-5.0.0.0" newVersion="5.0.0.0"/>
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35"/>
    <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35"/>
    <bindingRedirect oldVersion="1.0.0.0-5.0.0.0" newVersion="5.0.0.0"/>
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.Web.WebPages.Razor" publicKeyToken="31bf3856ad364e35"/>
    <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
  </dependentAssembly> -->
</assemblyBinding>
Run Code Online (Sandbox Code Playgroud)

顶部评论后评论的所有内容都因为我收到了错误:

警告2发现无法解析的同一依赖程序集的不同版本之间发生冲突.当日志详细程度设置为详细时,这些引用冲突将在构建日志中列出.

并且摆脱硬绑定正在解决这个问题.

c# asp.net-4.5 asp.net-web-api asp.net-mvc-5

143
推荐指数
6
解决办法
15万
查看次数

无法找到CodeDom提供程序类型"Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider"

这是一个使用VS2015的WebApi项目.

重现步骤:

  1. 创建一个空的WebApi项目
  2. 将构建输出路径从"bin"更改为"bin\Debug"

在此输入图像描述

一切都工作正常,直到我将构建输出路径从"bin \"更改为"bin\Debug \"实际上,除"bin"之外的任何输出路径都不起作用.

还有一点是,只要我在"bin"中留下构建版本,就可以使用另一个输出路径到任何地方.

请帮助提供解决方案.我想这会在实际部署上造成成本问题.

c# asp.net msbuild asp.net-web-api

143
推荐指数
10
解决办法
20万
查看次数

ASP.NET Web API - 不允许PUT和DELETE动词 - IIS 8

我最近从Visual Studio 2010升级到Visual Studio 2012 RC.安装程序还会安装IIS 8 Express,Visual Studio现在将其用作默认Web服务器.

IIS 8阻止了我使用PUT AND DELETE谓词的WEB API请求.IIS返回405错误,The requested resource does not support http method 'PUT'.

我知道过去人们对此有疑问,Stack Overflow上有几条关于它的消息.使用IIS 7 Express,解决方案是卸载WebDav.不幸的是,我没有看到任何与IIS 8相关的方法.

我已经尝试从applicationhost.config编辑出WebDav部分,但这没有帮助.例如,我<add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" />从配置文件中删除了.

我花了很长时间才研究这个问题.必须有一种简单的方法来启用PUT和DELETE?

asp.net iis asp.net-web-api iis-8

141
推荐指数
9
解决办法
18万
查看次数