我们有一个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”。虚拟目录已被删除。
问题是,为什么?
答案 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
是一个目录,但它看起来与机器不同。