WCF服务日期时解析不同客户端上的错误

时间:2014-09-05 15:03:29

标签: c# sql-server wcf datetime visual-studio-2012

我有关于使用WCF服务的问题:

接口:

[OperationContract]
[WebInvoke(Method = "POST",
    ResponseFormat = WebMessageFormat.Json,
    RequestFormat = WebMessageFormat.Json,
    UriTemplate = "list_LogUser")]
 DTO.Responses.List_LogUser list_LogUser(DTO.Requests.Token token);

请求:

public class Token
{
    public string ApiToken { get; set; }
}

响应:

public class List_LogUsuario
{
    public List<Select.LogUser> LogUsers { get; set; }
}

类别:

public class LogUser
{
   public int IdLogUser { get; set; }
   public string User { get; set; }
   public string Action { get; set; }
   public string Class { get; set; }
   public DateTime Date { get; set; }
}

实现:

public DTO.Responses.List_LogUser list_LogUser(DTO.Requests.Token token)
{
    try
    {
        DTO.Responses.List_LogUsuario response = new DTO.Responses.List_LogUsuario();

        if (BBSessionManager.Instance.validateAPIKEY(token.ApiToken))
        {
            response.LogUsers = new List<Select.LogUser>();
            Select.LogUser l = new Select.LogUser();

            DataTable dt = new DataTable();
            SqlDataAdapter sda = new SqlDataAdapter();
            string ConnString = ConfigurationManager.ConnectionStrings[clientConnString].ConnectionString;
            using (SqlConnection SqlConn = new SqlConnection(ConnString))
            {
                SqlConn.Open();

                SqlCommand sqlCmd = new SqlCommand(spName, SqlConn);
                sqlCmd.CommandType = CommandType.StoredProcedure;
                sda.SelectCommand = sqlCmd;
                sda.Fill(dt);
                SqlConn.Close();
                sqlCmd.Dispose();
                sda.Dispose();
            }

            DataRow[] rows = dt.Select();

            for (int i = 0; i < rows.Length; i++)
            {
                l = Utils.logUser_parse(rows[i]);
                response.LogUsers.Add(l);
            }

            response.Response = Constants.OK;
        }
        else
        {
            response.Response = Constants.ERROR;
        }

        return response;
    }
    catch (Exception ex)
    {
        ...
    }

}

BD Parser:

public static Select.LogUser logUser_parse(DataRow r)
    {
        Select.LogUser l = new Select.LogUser();
        ...
        l.Date = DateTime.ParseExact(r["Date"].ToString(), "M/d/yyyy h:mm:ss ttt", CultureInfo.InvariantCulture);
        ...

        return l;
    }

我尝试在CultureInfo.InvariantCulture上使用DateTime.ParseExact,但仍然没有结果。更令人好奇的是,当我在我的笔记本电脑上本地运行时它可以工作但是从我的办公室电脑上它给了我错误。我从另外两台笔记本电脑上测试了它,其中一台没有错我不知道我是否正确使用DateTime.ParseExact,或者我是否遗漏了其他内容。

堆栈跟踪:

  

System.FormatException:String未被识别为有效的DateTime。   在System.DateTimeParse.ParseExact(String s,String format,   DateTimeFormatInfo dtfi,DateTimeStyles style)at   System.DateTime.ParseExact(String s,String format,IFormatProvider   提供商)

1 个答案:

答案 0 :(得分:0)

我打赌发生的事情是,给你麻烦的电脑有不同的日期格式 - 参见控制面板 - &gt;地区 - &gt;格式

最好的办法是尝试TryParseExact该计算机的格式。

更好的选择是执行类似date.ToString("o")的操作,这将强制DateTime字符串采用通用格式,您应该没有解析问题。