C # Web Service - работает в IE, но не в Safari - PullRequest
2 голосов
/ 11 ноября 2009

У меня есть простой веб-сервис, доступ к которому я хочу получить через сообщение http. Код веб-сервиса показан ниже:

[WebMethod]
public int Insert(string userDate, string DeviceID)
{

    bool output;
    DateTime date;
    output = DateTime.TryParse(userDate, out date);
    if (!output)
    {
        // Throw an error
        return -1;
    }
    int Device;
    output = int.TryParse(DeviceID, out Device);
    if (!output)
    {
        // Throw an Error
        return -1;
    }
    UsersDatesBLL BLL = new UsersDatesBLL();
    return BLL.Insert(Device, date);
}

Я могу получить доступ к сервису в порядке с помощью Internet Explorer, результаты вставляются в базу данных просто, вызывая: CountDownService.asmx / Insert? UserDate = 24/04/1980 & DeviceID = 3435 Однако при тестировании в Safari и Firefox сервис всегда возвращает -1

Кто-нибудь знает причину этого? Safari кодирует строки иначе, чем IE?

С уважением Мик

Ответы [ 3 ]

1 голос
/ 11 ноября 2009

Пользователи могут настраивать язык и культуру пользовательского интерфейса в своем браузере. Браузер передает эту информацию как HTTP-заголовок Accept-Language в запросах к вашему веб-сервису. Эта информация может использоваться для установки "текущей культуры" сеанса ASP.NET , которая обрабатывает запрос. Он доступен как статическое свойство CultureInfo.CurrentCulture .

DateTime.TryParse будет использовать эту "текущую культуру", чтобы выяснить, какой из многих форматов строк даты-времени следует ожидать - если вы не используете перегрузку , когда явно передаете культуру как IFormatProvider. Очевидно, что браузеры, с которыми вы тестируете, настроены по-разному, поэтому ASP.NET ожидает разные форматы даты и времени от каждого. Если вы хотите, чтобы даты и время анализировались независимо от настроек браузера, вам следует использовать CultureInfo.InvariantCulture в качестве поставщика формата.

0 голосов
/ 11 ноября 2009

Вы используете текущую культуру для анализа значений DateTime и int. Первое, что нужно проверить - все ли ваши браузеры настроены на отправку одной и той же культуры на веб-сервер в своих заголовках HTTP-запроса.

Из соображений стиля следует избегать использования зависящих от культуры форматов для параметров URL. Наиболее подходящий формат для использования - это фиксированный формат XML-схемы, например:

[WebMethod]
public int Insert(string userDate, string DeviceID) {

    DateTime date;
    int device;
    try {
        date = XmlConvert.ToDateTime(userDate, XmlDateTimeSerializationMode.Local);
        device = XmlConvert.ToInt32(DeviceID);
    } catch (Exception) {
        // Throw an error
        return -1;
    }

    UsersDatesBLL BLL = new UsersDatesBLL();
    return BLL.Insert(device, date);
}

И назовите это так:

CountDownService.asmx/Insert?userDate=1980-04-24&DeviceID=3435

Другая альтернатива - использовать строго типизированные значения параметров и позволить ASP.NET выполнить анализ за вас, например,

[WebMethod]
public int Insert(DateTime userDate, int DeviceID) {

    UsersDatesBLL BLL = new UsersDatesBLL();
    return BLL.Insert(DeviceID, userDate);
}

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ - Я сам не пробовал эту альтернативу, но стоит посмотреть, потому что она облегчит вашу жизнь, если вам не нужно будет вставлять код анализа в каждый веб-метод.

0 голосов
/ 11 ноября 2009

Первое, что я бы сделал в качестве меры отладки (при условии, что вы не можете просто запустить отладчик на коде сервера), было бы заставить все три пути возврата возвращать разные значения. Таким образом, вам не придется угадывать, был ли сбой вызов DateTime.TryParse(), вызов int.TryParse() или BLL.Insert().

Если BLL.Insert() возвращает -1 при ошибке, то я бы изменил первое -1 на -3, а второе на -2. Вот так:

output = DateTime.TryParse(userDate, out date);
if (!output)
{
    // Throw an error
    return -3;  // ***** Changed this line
}
int Device;
output = int.TryParse(DeviceID, out Device);
if (!output)
{
    // Throw an Error
    return -2;  // ***** Changed this line
}

Я знаю, что это не совсем отвечает на вопрос, но это, по крайней мере, поможет вам отследить, какая часть неисправна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...