0

誰でも私を助けてもらえますか?mvc 4 WebApi アプリケーションにローカリゼーションを実装しようとしています。リクエストヘッダーで渡された「User-Locale」に基づいて、カルチャ固有のページをユーザーに表示したいと考えています。

私がやったことは、以下に示すように LinkedAccountModel クラスを持っていることです-

 public class LinkedAccountModel
{

    public string Id { get; set; }

    [Required(ErrorMessageResourceType = typeof(LanguageResources.Resource), ErrorMessageResourceName = "DomainNameRequired")]
    [DataType(DataType.Password)]
    [Display(Name = "DomainName", ResourceType = typeof(LanguageResources.Resource))]
    public string DomainName { get; set; }


    [Required(ErrorMessageResourceType = typeof(LanguageResources.Resource), ErrorMessageResourceName = "UserNameRequired")]
    [Display(Name = "UserName", ResourceType = typeof(LanguageResources.Resource))]
    public string UserName { get; set; }


    [Required(ErrorMessageResourceType = typeof(LanguageResources.Resource), ErrorMessageResourceName = "PasswordRequired")]
    [DataType(DataType.Password)]
    [Display(Name = "Password", ResourceType = typeof(LanguageResources.Resource))]
    public string Password { get; set; }

    [Required(ErrorMessageResourceType = typeof(LanguageResources.Resource), ErrorMessageResourceName = "ServerNameRequired")]
    [Display(Name = "ServerName", ResourceType = typeof(LanguageResources.Resource))]
    public string ServerName { get; set; }

    [Required]
    public long UserId { get; set; }
}

================================================== ======================

これで、このモデルを使用する ExchangeAccountSetupController ができました。このコントローラーは、BaseController によって実装されます。私のExchangeAccountSetupControllerは次のようになります-

public class ExchangeAccountSetupController : BaseController
{
    private PersistenceManagerAsync _persistenceManager;

    public async Task<ActionResult> New(string sessionToken)
    {
        if (string.IsNullOrEmpty(sessionToken))
        {               
            ViewBag.Title = LanguageResources.Resource.AccountConfigurationFailed;
            ViewBag.ErrorMessage = LanguageResources.Resource.UnableToProcessRequest;

            return View("Message");
        }

        _persistenceManager = new PersistenceManagerAsync(null);
        var token = await _persistenceManager.RetrieveAsync<SessionToken>(string.Format("{0}|{1}", sessionToken.Substring(0, 10), sessionToken));
        if (token == null)
        {                
            ViewBag.Title = LanguageResources.Resource.AccountConfigurationFailed;
            ViewBag.ErrorMessage = LanguageResources.Resource.UnableToProcessRequest;
            return View("Message");
        }

        _persistenceManager = new PersistenceManagerAsync(token);
        var user = new User { UserId = token.UserId };
        var linkedAccount = await LinkedAccountManager.RetrieveLinkedAccount(_persistenceManager, user, "Exchange");
        var linkedAccountModel = new LinkedAccountModel { UserId = token.UserId };

        var existingUser = await _persistenceManager.RetrieveAsync<User>(user.PartitionKey, user.RowKey);          
        if (linkedAccount != null)
        {
            ViewBag.Title = LanguageResources.Resource.ChangePassword;

            linkedAccountModel.DomainName = linkedAccount.DomainName;
            linkedAccountModel.UserName = linkedAccount.UserName;
            if (!string.IsNullOrEmpty(linkedAccount.Url))
                linkedAccountModel.ServerName = new Uri(linkedAccount.Url).Host;
            return View("New", linkedAccountModel);
        }
        ViewBag.Title = LanguageResources.Resource.ConfigureNewExchangeAccount; //default title.
        return View("New", linkedAccountModel);
    }

================================================== ======================

私の BaseController は次のようになります -

public class BaseController : Controller
{
    protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state)
    {
        string currentLocale = string.Empty;
        if (Request.Headers["User-Locale"] == null || string.IsNullOrEmpty(Request.Headers["User-Locale"]))
            currentLocale = "en-US";
        else
            currentLocale = Request.Headers["User-Locale"];
        // Modify current thread's cultures                        
        string[] localeKeys = currentLocale.Split('-');
        if (localeKeys[0].Equals("en"))
            currentLocale = "en-US";
        else if (localeKeys[0].Equals("nl"))
            currentLocale = "nl-NL";
        else
            currentLocale = "en-US";

        Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(currentLocale);
        Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;

        return base.BeginExecuteCore(callback, state);
    }
}

================================================== ======================

私のクライアント アプリケーションは Dotnet のみです。「ExchangeAccountSetupController」コントローラの New() アクションにリクエストを送信しています。

これは、HttpClient Request にヘッダーを追加するクライアント アプリケーション コードです。

 var client = new HttpClient();

client.Timeout = 新しい TimeSpan(1, 1, 1); client.DefaultRequestHeaders.Add("User-Locale", "nl-NL");

var webResponse = httpClient.GetAsync(RestServiceUrl.GetLinkedAccountProviderUrl(accountProviderName)).Result; if (webResponse.StatusCode != HttpStatusCode.OK) return null;

        var url = JsonConvert.DeserializeObject<string>(webResponse.Content.ReadAsStringAsync().Result);
        return url;    

私の問題は、クライアントからリクエストを送信するたびに、リクエストが BaseController に正常に到達することです。しかし、BeginExecuteCore() メソッドの下の現在の Request オブジェクトでその「User-Locale」にアクセスできません。Request オブジェクトから "User-Locale" ヘッダーにアクセスできません。Request.Headers["User-Locale"] で何も取得できませんでした。null が表示されます。

私が何か間違っているかどうか教えてください.BeginExecuteCore()メソッドの下でそのヘッダーにアクセスできるかどうかさえわかりません.どんな提案でも大歓迎です.

4

1 に答える 1

1

User-LocaleHTTP にはヘッダーが定義されていません。Accept-Languageあなたはおそらくヘッダーを探しています。
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4 MVC Web API からは、 Request.Headers.AcceptLanguage.

このプロパティを使用して、解析された言語のリストを取得することもできます HttpContext.Current.Request.UserLanguages
。ドキュメントの記述に反して、リストはソートされていないことに注意してください。
http://msdn.microsoft.com/en-us/library/system.web.httprequest.userlanguages(v=vs.110).aspx

于 2013-11-15T17:46:48.153 に答える