У меня есть работающая служба ASP.Net MVC Web API, работающая на производственном сервере (prod.mydomain.com).Когда я скопировал файлы и папки на промежуточный сервер (stage.mydomain.com) и сервер разработки (dev.mydomain.com), служба Web API выдает ошибку CORS, когда веб-приложения, запущенные на промежуточном сервере или сервере разработки, вызываютвеб-API с помощью пользовательской библиотеки C # helper.Однако Web API работает, если в вызовах используется Angular $ resource.Спасибо за вашу помощь.
EnableCORS в контроллере Web API:
[EnableCors(origins: "http://localhost:4200,http://dev.mydomain.com,http://stage.mydomain.com, , headers: "*", methods: "*", SupportsCredentials = true)]
Вызов со страницы ASP.Net выглядит следующим образом:
public class User_Controller {
public static UserProfile getUserProfileFromWebApi(string networkName) {
UserProfile thisProfile = HelpersLib.WebApiBroker.Get< UserProfile> (
System.Configuration.ConfigurationManager.AppSettings["UserProfile_Service"],
"User/Profile/" + networkName).Result;
return thisProfile;
}
}
Вызов с использованием Angular $ resource выглядит следующим образом:
(function() {
'use strict';
var moduleName = 'userProfileFactoryModule';
var factoryName = 'userProfileFactory';
var requiredModules = ["ngResource", "configModule"];
var dependencyInjection = ['$resource', 'api', 'userAccount', internalFunc];
angular.module(moduleName, requiredModules)
.factory(factoryName, dependencyInjection);
function internalFunc($resource, api, userAccount) {
function getUserProfile() {
return $resource(api.userProfile + 'user/profile/:NN', {
NN: '@NN'
});
};
return {
//usage: userProfileFactory.getUserProfile()
getUserProfile /*public method*/: getUserProfile /*internal method above*/
}
}
})();
Сервисная библиотека C # выглядит следующим образом:
public namaspace HelpersLib {
public static class WebApiBroker {
public static async Task <T> Get <T> (string baseUrl, string urlSegment) {
string content = string.Empty;
using(HttpClient client = GetClient(baseUrl)) {
//reference http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html
HttpResponseMessage response = await client.GetAsync(urlSegment.TrimStart('/')).ConfigureAwait(false);
if (response.IsSuccessStatusCode) {
content = await response.Content.ReadAsStringAsync();
}
return JsonConvert.DeserializeObject <T> (content);
}
}
public static HttpClient GetClient(string svcLocation) {
string myUri = svcLocation;
CredentialCache cc = new CredentialCache();
cc.Add(new Uri(myUri), "NTLM", CredentialCache.DefaultNetworkCredentials);
HttpClientHandler handler = new HttpClientHandler();
handler.Credentials = cc;
HttpClient client = new HttpClient(handler);
client.BaseAddress = new Uri(myUri);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
return client;
}
}
}