Вызов функции C # с другого локального узла в .net? [Дубликат]

Если вы не хотите использовать какой-либо объект, вы можете использовать setattr() внутри вашего текущего модуля:

import sys
current_module = module = sys.modules[__name__]  # i.e the "file" where your code is written
setattr(current_module, 'variable_name', 15)  # 15 is the value you assign to the var
print(variable_name)  # >>> 15, created from a string
76
задан abatishchev 22 June 2015 в 21:07
поделиться

8 ответов

Может быть только один заголовок ответа Access-Control-Allow-Origin, и этот заголовок может иметь только одно исходное значение. Поэтому, чтобы заставить это работать, вам необходимо иметь код:

  1. Захватывает заголовок запроса Origin.
  2. Проверяет, является ли исходное значение одним из значений белого списка.
  3. Если он действителен, устанавливает заголовок Access-Control-Allow-Origin с этим значением.

Я не думаю, что есть какой-либо способ сделать это исключительно через web.config.

if (ValidateRequest()) {
    Response.Headers.Remove("Access-Control-Allow-Origin");
    Response.AddHeader("Access-Control-Allow-Origin", Request.UrlReferrer.GetLeftPart(UriPartial.Authority));

    Response.Headers.Remove("Access-Control-Allow-Credentials");
    Response.AddHeader("Access-Control-Allow-Credentials", "true");

    Response.Headers.Remove("Access-Control-Allow-Methods");
    Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
}
66
ответ дан Crispy Ninja 21 August 2018 в 18:57
поделиться
  • 1
    Это отвечает на мой вопрос. Я не уверен, почему Microsoft не позволяет указывать несколько истоков в web.config, хотя .... – Sam 27 June 2013 в 07:56
  • 2
    Где я могу добавить этот код? У меня есть текстовые текстовые файлы, созданные сервером, и чтение через AJAX, никакого кода вообще. Где я могу поместить код для ограничения доступа к текстовым файлам в моем каталоге? – Harry 5 February 2014 в 14:58
  • 3
    ну это неинтуитивно! Почему же это не просто «Access-Control-Allow-Origin: Yes»? – Simon_Weaver 27 April 2015 в 06:36
  • 4
    @Simon_Weaver есть значение *, которое позволяет любому источнику доступа к ресурсу. Однако исходный вопрос заключался в том, чтобы задать белый список набора доменов. – monsur 29 April 2015 в 02:15

Мне удалось решить эту проблему в коде обработки запроса, следуя советам «monsur».

string origin = WebOperationContext.Current.IncomingRequest.Headers.Get("Origin");

WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Origin", origin);
2
ответ дан abatishchev 21 August 2018 в 18:57
поделиться
  • 1
    Вот как это сделать в веб-форме, например. Просто используйте Request.Headers, когда они доступны. И, если необходимо, используйте белый список для фильтрации разрешенных доменов. – AFract 23 March 2015 в 12:19
  • 2
    Это так же хорошо, как добавление & lt; add name = & quot; Access-Control-Allow-Origin & quot; значение = & Quot; * & Quot; / & GT; в файле web.config – Isaiah4110 11 September 2015 в 16:36

Посмотрите на библиотеку IdentityType IdentityModel - она ​​имеет полную поддержку CORS:

http://brockallen.com/2012/06/28/cors-support-in-webapi-mvc -and-iis-with-thinktecture-identitymodel /

И он может динамически излучать ACA-Origin, который вы хотите.

2
ответ дан Brock Allen 21 August 2018 в 18:57
поделиться
  • 1
    Это похоже на действительно полезную библиотеку. Спасибо за ссылку. – Sam 27 June 2013 в 07:56

Вы можете использовать среднюю программу owin для определения политики cors, в которой вы можете определить несколько корсовых происхождений

return new CorsOptions
        {
            PolicyProvider = new CorsPolicyProvider
            {
                PolicyResolver = context =>
                {
                    var policy = new CorsPolicy()
                    {
                        AllowAnyOrigin = false,
                        AllowAnyMethod = true,
                        AllowAnyHeader = true,
                        SupportsCredentials = true
                    };
                    policy.Origins.Add("http://foo.com");
                    policy.Origins.Add("http://bar.com");
                    return Task.FromResult(policy);
                }
            }
        };
0
ответ дан chayan banerjee 21 August 2018 в 18:57
поделиться

Прочитав каждый ответ и попробовав их, никто из них не помог мне. То, что я нашел во время поиска в другом месте, заключается в том, что вы можете создать настраиваемый атрибут, который затем добавить в свой контроллер. Он перезаписывает EnableCors и добавляет в него белые списки.

Это решение работает хорошо, потому что оно позволяет вам иметь белые списки в webconfig (appsettings) вместо того, чтобы их кодировать в атрибуте EnableCors на вашем контроллере .

 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
public class EnableCorsByAppSettingAttribute : Attribute, ICorsPolicyProvider
{
    const string defaultKey = "whiteListDomainCors";
    private readonly string rawOrigins;
    private CorsPolicy corsPolicy;

    /// <summary>
    /// By default uses "cors:AllowedOrigins" AppSetting key
    /// </summary>
    public EnableCorsByAppSettingAttribute()
        : this(defaultKey) // Use default AppSetting key
    {
    }

    /// <summary>
    /// Enables Cross Origin
    /// </summary>
    /// <param name="appSettingKey">AppSetting key that defines valid origins</param>
    public EnableCorsByAppSettingAttribute(string appSettingKey)
    {
        // Collect comma separated origins
        this.rawOrigins = AppSettings.whiteListDomainCors;
        this.BuildCorsPolicy();
    }

    /// <summary>
    /// Build Cors policy
    /// </summary>
    private void BuildCorsPolicy()
    {
        bool allowAnyHeader = String.IsNullOrEmpty(this.Headers) || this.Headers == "*";
        bool allowAnyMethod = String.IsNullOrEmpty(this.Methods) || this.Methods == "*";

        this.corsPolicy = new CorsPolicy
        {
            AllowAnyHeader = allowAnyHeader,
            AllowAnyMethod = allowAnyMethod,
        };

        // Add origins from app setting value
        this.corsPolicy.Origins.AddCommaSeperatedValues(this.rawOrigins);
        this.corsPolicy.Headers.AddCommaSeperatedValues(this.Headers);
        this.corsPolicy.Methods.AddCommaSeperatedValues(this.Methods);
    }

    public string Headers { get; set; }
    public string Methods { get; set; }

    public Task<CorsPolicy> GetCorsPolicyAsync(HttpRequestMessage request,
                                               CancellationToken cancellationToken)
    {
        return Task.FromResult(this.corsPolicy);
    }
}

    internal static class CollectionExtensions
{
    public static void AddCommaSeperatedValues(this ICollection<string> current, string raw)
    {
        if (current == null)
        {
            return;
        }

        var paths = new List<string>(AppSettings.whiteListDomainCors.Split(new char[] { ',' }));
        foreach (var value in paths)
        {
            current.Add(value);
        }
    }
}

Я нашел это руководство онлайн и работал как шарм:

http://jnye.co/Posts/2032/dynamic-cors-origins -from-appsettings-using-web-api-2-2-cross-origin-support

Я думал, что убью это для всех, кто в этом нуждается.

3
ответ дан Helpha 21 August 2018 в 18:57
поделиться
  • 1
    Это ответ только для ссылок. Вместо этого сделайте ответ самостоятельно. – Kuba Ober 4 November 2016 в 21:12
  • 2
    Хорошо, я здесь новый, это больше похоже на то, что это должно было быть? – Helpha 4 November 2016 в 21:22

Для IIS 7.5+ и Rewrite 2.0 вы можете использовать:

<system.webServer>
   <httpProtocol>
     <customHeaders>
         <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />
         <add name="Access-Control-Allow-Methods" value="POST,GET,OPTIONS,PUT,DELETE" />
     </customHeaders>
   </httpProtocol>
        <rewrite>            
            <outboundRules>
                <clear />                
                <rule name="AddCrossDomainHeader">
                    <match serverVariable="RESPONSE_Access_Control_Allow_Origin" pattern=".*" />
                    <conditions logicalGrouping="MatchAll" trackAllCaptures="true">
                        <add input="{HTTP_ORIGIN}" pattern="(http(s)?://((.+\.)?domain1\.com|(.+\.)?domain2\.com|(.+\.)?domain3\.com))" />
                    </conditions>
                    <action type="Rewrite" value="{C:0}" />
                </rule>           
            </outboundRules>
        </rewrite>
 </system.webServer>

Объяснение части переменной сервера RESPONSE_Access_Control_Allow_Origin: в Rewrite вы можете использовать любую строку после RESPONSE_, и она создаст ответ Заголовок, использующий остальную часть слова в качестве имени заголовка (в этом случае Access-Control-Allow-Origin). Rewrite использует символы подчеркивания «_» вместо тире «-» (переписать их в тире)

Объяснение переменной сервера HTTP_ORIGIN: Аналогично, в Rewrite вы можете захватить любой заголовок запроса, используя HTTP_, как префикс. Те же правила с тире (используйте символы подчеркивания «_» вместо тире «-»).

58
ответ дан Paco Zarate 21 August 2018 в 18:57
поделиться
  • 1
    Можете ли вы придумать какие-либо причины, почему это не будет работать с IIS 7.5? – Phil Ricketts 3 July 2015 в 10:06
  • 2
    Я думаю, это должно сработать. Я указал версию IIS 8.5, потому что именно там я ее протестировал. – Paco Zarate 7 July 2015 в 07:47
  • 3
    @PacoZarate Хороший, отличный совет. Чтобы упростить регулярное выражение и сделать его более общим, вы можете использовать - (http(s)?:\/\/((.+\.)?(domain1|domain2)\.(com|org|net))). Таким образом, вы можете легко добавлять другие домены и поддерживать несколько доменов верхнего уровня (например, com, org, net и т. Д.). – Merlin 11 November 2015 в 07:35
  • 4
    Просто попробовал это в IIS 7.5. Кажется, все работает нормально. – Prescient 25 November 2015 в 18:17
  • 5
    Проблемы с кэшированием? После настройки web.config, первый веб-сайт, который я перехожу на соответствие, отлично, но второй возвращает тот же заголовок, что и первый. Таким образом, домены не слишком совпадают. – Airn5475 28 March 2018 в 18:41

Вам нужно только: - добавить в проект Global.asax, - удалить из вашего web.config. - после добавления в Application_BeginRequest метода Global.asax это:

HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin","*");

if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
{
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS,PUT,DELETE");
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, Accept");
    HttpContext.Current.Response.End();
}

Надеюсь, эта помощь. которые работают для меня.

-2
ответ дан Philippe Lavoie 21 August 2018 в 18:57
поделиться
  • 1
    Добавление "...- Происхождение: * & quot; работает, за исключением случаев, когда вы разрешаете учетные данные. Если у вас есть учетные данные allow-credentials равным true, вам необходимо указать домен (а не просто *). Вот в чем суть этой проблемы. В противном случае вы можете просто указать & quot; ... allow-credentials: false & quot; и покончить с этим. – Richard 25 September 2013 в 15:01

В Web.API этот атрибут можно добавить с помощью Microsoft.AspNet.WebApi.Cors, как описано в http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in- web-api

В MVC вы можете создать атрибут фильтра для выполнения этой работы для вас:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method,
                AllowMultiple = true, Inherited = true)]
public class EnableCorsAttribute : FilterAttribute, IActionFilter {
    private const string IncomingOriginHeader = "Origin";
    private const string OutgoingOriginHeader = "Access-Control-Allow-Origin";
    private const string OutgoingMethodsHeader = "Access-Control-Allow-Methods";
    private const string OutgoingAgeHeader = "Access-Control-Max-Age";

    public void OnActionExecuted(ActionExecutedContext filterContext) {
        // Do nothing
    }

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var isLocal = filterContext.HttpContext.Request.IsLocal;
        var originHeader = 
             filterContext.HttpContext.Request.Headers.Get(IncomingOriginHeader);
        var response = filterContext.HttpContext.Response;

        if (!String.IsNullOrWhiteSpace(originHeader) &&
            (isLocal || IsAllowedOrigin(originHeader))) {
            response.AddHeader(OutgoingOriginHeader, originHeader);
            response.AddHeader(OutgoingMethodsHeader, "GET,POST,OPTIONS");
            response.AddHeader(OutgoingAgeHeader, "3600");
        }
    }

    protected bool IsAllowedOrigin(string origin) {
        // ** replace with your own logic to check the origin header
        return true;
    }
}

Затем либо включить его для определенных действий / контроллеров:

[EnableCors]
public class SecurityController : Controller {
    // *snip*
    [EnableCors]
    public ActionResult SignIn(Guid key, string email, string password) {

Или добавьте его для всех контроллеров в Global.asax.cs

protected void Application_Start() {
    // *Snip* any existing code

    // Register global filter
    GlobalFilters.Filters.Add(new EnableCorsAttribute());
    RegisterGlobalFilters(GlobalFilters.Filters);

    // *snip* existing code
}
15
ответ дан Rob Church 21 August 2018 в 18:57
поделиться
  • 1
    Вы знаете, для каких версий .Net / MVC это работает? – Keab42 14 July 2015 в 09:29
  • 2
    Я использую это успешно в .net 4 / MVC 3 - насколько я знаю, он должен работать в более высоких версиях, но может быть предпочтительный способ регистрации глобального фильтра в более поздних версиях MVC. – Rob Church 15 July 2015 в 13:03
  • 3
    просто обратите внимание на его решение WEB API 2. не для WEB API 1. – Samih A 24 March 2017 в 14:29
Другие вопросы по тегам:

Похожие вопросы: