使用HttpClient访问作为虚拟目录运行的Web服务

时间:2014-06-09 15:33:53

标签: c# asp.net-mvc

我们有一个MVC Web应用程序,它使用System.Net.HttpClient.PostAsJsonAsync对Web服务进行服务器端调用。

当webservice作为IIS中的根站点运行时,这很正常。但是当我们在IIS中将其配置为虚拟目录时,System.Net.HttpClient.PostAsJsonAsync将发布到错误的URL。

using (var client = new HttpClient())
{
      var webServiceUrl = ConfigurationManager.AppSettings["WebServiceUrl"];
      if (webServiceUrl == null)
           throw new Exception("WebServiceUrl not set in web.config");

      client.BaseAddress = new Uri(webServiceUrl);
      client.DefaultRequestHeaders.Accept.Clear();
      client.DefaultRequestHeaders.Accept.Add(
      new MediaTypeWithQualityHeaderValue("application/json"));

      HttpResponseMessage response = 
           await client.PostAsJsonAsync("api/Authentication", loginModel);

      if (response.IsSuccessStatusCode)
           ...

当我在调试器中追踪这个时,我看到webServiceUrl被设置为域+虚拟目录(即http://mydomain.com/myvirtualdirectory)。

然后当我得到响应时,它有一个StatusCode 404,“Not Found”。事情就是这样 - 响应对象包含RequestMessage,请求中的URL不包含虚拟目录。

我们已经开始使用BaseAddress为“http://mydomain.com/myvirtualdirectory”和RequestUri为“api / Authentication”,我在RequestMessage中看到的是“http://mydomain.com/api/Authentication”。虚拟目录已被删除。

问题是,为什么?

2 个答案:

答案 0 :(得分:1)

这里看起来很清楚:WebClient对虚拟目录一无所知。从客户端的角度来看,虚拟目录只是另一个文件夹。而不是

await client.PostAsJsonAsync("api/Authentication", loginModel);

你应该使用:

await client.PostAsJsonAsync("myvirtualdirectory/api/Authentication", loginModel);

答案 1 :(得分:1)

您可能希望BaseUri以斜杠结束。

想象一下,您的浏览器位于http://example.com/myvirtualdirectory,并且有一个指向api的链接。 它会去哪里?

http://example.com/api

想象一下,有api/Authentication的链接。 它指向哪里? 致http://example.com/api/Authentication

所以你明白为什么会这样。 知道myvirtualdirectory是一个目录,但它看起来与机器不同。