C# 在WebServices中将CultureInfo值存储为会话格式

C# 在WebServices中将CultureInfo值存储为会话格式,c#,.net,web-services,session,cultureinfo,C#,.net,Web Services,Session,Cultureinfo,正如标题所说,我试图创建一个CultureInfo对象,并将其值保存在会话中。并在方法中使用保存的CultureInfo对象作为返回值。但我得到了这个错误,我找不到解决办法!请看一看 类别: public class DateTimeService : WebService { [WebMethod(EnableSession = true)] [ScriptMethod(UseHttpGet = true)] public string FormatDate(strin

正如标题所说,我试图创建一个CultureInfo对象,并将其值保存在会话中。并在方法中使用保存的CultureInfo对象作为返回值。但我得到了这个错误,我找不到解决办法!请看一看

类别:

public class DateTimeService : WebService
{
    [WebMethod(EnableSession = true)]
    [ScriptMethod(UseHttpGet = true)]
    public string FormatDate(string dateString)
    {
        DateTime date;
        var ci = new CultureInfo(Session["Format"].ToString()); //Culture is not supported. 
        var formats = Session["Format"].ToString();
        DateTime.TryParseExact(dateString, formats, ci, DateTimeStyles.None, out date);
        return date.ToString(ci);
    }

    [WebMethod(EnableSession = true)]
    [ScriptMethod(UseHttpGet = true)]
    public void SetFormat(string formatString)
    {
        Session["Format"] = formatString;
    }

    [WebMethod(EnableSession = true)]
    [ScriptMethod(UseHttpGet = true)]
    public void SetCulture(string language)
    {
        if (language == "sv-SE")
        {
            Session["CultureValue"] = new CultureInfo("sv-SE", false);
        }

        if (language == "en-US")
        {
            Session["CultureValue"] = new CultureInfo("en-US", false);
        }
    }
Global.asax(其中应用默认会话值):

非常感谢您的帮助

两个问题:

您使用的是“Format”会话变量,它不应该是“CultureValue”变量吗

您应该强制转换会话变量

我也不明白这有什么意义:

public void SetCulture(string language)
{
    if (language == "sv-SE")
    {
        Session["CultureValue"] = new CultureInfo("sv-SE", false);
    }

    if (language == "en-US")
    {
        Session["CultureValue"] = new CultureInfo("en-US", false);
    }
}
除非您想限制允许使用哪些“语言”(实际上它们是“languagecode2国家/地区代码2”格式的CultureInfo名称),否则此代码不是很有用,可以简化为:

public void SetCulture(string language)
{
    Session["CultureValue"] = CultureInfo.CreateSpecificCulture(language);
}

你到底有什么问题?哪一行代码给了您一个例外?您似乎试图根据日期格式字符串创建一个
CultureInfo
,例如
ddMMYYYY
。我将会话[“format”]更改为会话[“CultureValue”],现在我得到一个:“对象引用未设置为对象的实例。”错误。我更改了会话,现在它显示。“对象引用未设置为对象的实例。”不过,我不明白你的第二个问题解决方案是什么意思。您是否可以更具体一些=您需要执行
var ci=(CultureInfo)会话[“CultureValue”]
但是,在执行此操作之前,您当然需要检查
会话[“CultureValue”]
是否不为空。何时调用
SetCulture(字符串语言)
?当用户使用某种语言键入时,将调用SetCulture方法。因此:“var ci=(CultureInfo)会话[“CultureValue”];”仍然为空。为什么?如果我是你,我会在
Session\u Start
中设置一个默认的
Session[“CultureValue”]
,这样你就可以确保在使用它时有一个值。与
会话[“Format”]
的逻辑相同。好的,我给了它一个默认值,但后来我得到了这个错误。无法在“var ci=(CultureInfo)会话[“CultureValue”];”处将类型为“System.String”的对象强制转换为类型为“System.Globalization.CultureInfo”。。。
public void SetCulture(string language)
{
    if (language == "sv-SE")
    {
        Session["CultureValue"] = new CultureInfo("sv-SE", false);
    }

    if (language == "en-US")
    {
        Session["CultureValue"] = new CultureInfo("en-US", false);
    }
}
public void SetCulture(string language)
{
    Session["CultureValue"] = CultureInfo.CreateSpecificCulture(language);
}