Записи с тегом «.NET»
Specified-поля в SOAP веб-сервисах
В уже упоминавшемся ASP.NET-приложении, которое использует сторонний SOAP-веб сервис, для генерации proxy-классов использует механизм, доступный из Visual Studio как «Add Web Reference». После обновления до Visual Studio 2010 SP1 для элементов, объявленных в WSDL с аттрибутом minOccurs="0" с типом, отличным от type="xsd:string", например, так:
<xsd:element minOccurs="0" name="MyField" type="xsd:boolean" />
В proxy-классах генерировалось дополнительное свойство bool MyFieldSpecified. Если не поставить его в true перед вызовом веб-сервиса, поле не будет включено в SOAP-запрос. В моём случае изменить веб-сервис не было возможности (он сторонний), а все поля в вызове сервиса на самом деле обязательные. Найденные существующие решения либо требовали дополнительной обработки кода proxy-классов, либо ручного заполнения свойств или не подходили в моей ситуации.
Перехват и отладка запросов к SOAP веб-сервису в .NET
Одно из наших ASP.NET-приложений использует сторонний SOAP-веб сервис. На стороне .NET исторически (со времён .NET 2.0) для генерации proxy-классов использовался механизм, доступный из Visual Studio как «Add Web Reference» (подробнее о способах добавления ссылки на веб-сервис можно можно прочитать здесь, стоит только заметить, что в Visual Studio 2010 SP1 соответствующий пункт меню переехал внутрь диалогового окна «Add Service Reference»).
Во время отладки приложения понадобилось проверить XML-код SOAP-запроса. Сделать это оказалось довольно просто. Во-первых, в код приложения нужно временно добавить:
var myService = new MyServiceProxyClass();
// Перенаправляем запросы через HTTP-прокси
myService.Proxy = new System.Net.WebProxy("http://127.0.0.1:8888");
// Используем сервис как обычно...
Во-вторых, нужно запустить HTTP-прокси по указанному адресу. Мы использовали Fiddler, он позволяет просматривать весь HTTP-траффик, который через него проходит.
Решение для WCF-сервисов ещё не нашлось...
Шаблоны e-mail'ов в ASP.NET MVC
По аналогии с решением для WebForms, в ASP.NET MVC можно использовать для генерации текста e-mail'ов обычные view. Работающее решение нашлось на одном, к сожалению, не отзывающемся сейчас сайте.
Extension-методы для DataRow и DataTable
Долгое время использовал такую конструкцию если нужно было получить данные из нетипизированного DataRow:
var temp = Convert.ToInt32(row["SomeField"]);
В случае, когда нужно было обработать nullable-поля, то использовался вот такой метод:
/*
* Taken from: http://stackoverflow.com/questions/209160/nullable-type-as-a-generic-parameter-possible
*/
public static Nullable<T> GetValueOrNull<T>(DataRow row, string key) where T : struct
{
object columnValue = row[key];
if (!(columnValue is DBNull))
return (T)columnValue;
return null;
}
...
int? temp = GetValueOrNull<int>(row, "SomeField");
Оказалось, что есть более простой способ с использованием extension-метода Field<>():
int temp = row.Field<int>("SomeField");
Для класса DataTable есть свой набор полезных расширений
Ошибка "The full-text query parameter for Fulltext Query String is not valid" после обновления на .NET 4.0
После обновления до ASP.NET 4.0 реализация полнотекстового поиска с LINQ2SQL, описанная в сниппете более чем годичной давности перестала работать со следующей ошибкой: The full-text query parameter for Fulltext Query String is not valid.
Ошибка Validation of viewstate MAC failed (Проверка состояние вида MAC не удалась) или 404 во время PostBack при использовании HTML-тега base
Проблема возникает, если для страниц сайта на ASP.NET Web Forms определён тег <base />, например, следующим образом:
<base href="http://example.com" />
Страницы, находящиеся на том же уровне, что и URL в теге <base /> будут работать нормально (например, такая страница: http://example.com/SomePage.aspx), но стоит
попытаться использовать ещё одну страницу с тем же именем в подпапке, например, http://example.com/Folder/SomePage.aspx и при первом PostBack'e возникнет ошибка «Validation of viewstate MAC failed (Проверка состояние вида MAC не удалась)». В случае, если на сайте существует только одна страница с таким именем, т.е. или http://example.com/Folder/SomePage.aspx, или http://example.com/SomePage.aspx ошибка будет уже стандартной HTTP-ошибкой 404.
Причина ошибки в том, что тег <form> будет сформируется следующим образом:
<form name="aspnetForm" method="post" action="SomePage.aspx" id="aspnetForm">
Из-за тега <base /> результирующий URL для отправки формы будет неверным: http://example.com/SomePage.aspx, где часть http://example.com/ берется из тега <base />, а SomePage.aspx из атрибута action формы.
Способ исправления этой ошибки аналогичен решению проблемы с PostBack'ом при использовании URL Rewriting'а.
Запись параметров конфигурации в App.config
Для консольных и WinForms приложений для хранения параметров конфигурации удобно использовать файл App.config, сохраняя собственные параметры в секции <appSettings />. Иногда бывает необходимо не только читать эти параметры, но и изменять их значения. Конечно, для серьезного приложения этот способ не очень хорош (нужны права на запись), но для какой-то небольшой консольной утилиты с тремя параметрами — в самый раз.
Генерация не-HTML контента в ASP.NET MVC
Иногда бывает нужно сгенерировать контент с Content-Type отличным от text/html, например, RSS-ленту или JavaScript-информер. В случае использования WebForms или ASP.NET MVC с WebForms View Engine проблема решается следующим образом:
<%@ Page ContentType="application/x-javascript" Language="C#" Inherits="..." %>
или, например:
<%@ Page ContentType="application/rss+xml" Language="C#" Inherits="..." %>
P.S. Для RSS конечно правильнее будет использовать встроенные средства .NET Framework'a, но, например, если нужно добавить нестандартные теги, возможно, решение с шаблоном будет удобнее.
ASP.NET HTTP-хендлер, возвращающий данные в формате JSON
Существует несколько способов вернуть данные в формате JSON из ASP.NET:
- Начиная с ASP.NET 3.5 для этого можно использовать обычные (
.asmx) веб-сервисы - В той же версии 3.5 можно использовать WCF
- Использовать специальные библиотеки, например Jayrock
- Использовать обычные
.ashx-хендлеры (работает и на ASP.NET 2.0)
Singleton в ASP.NET (per-request singleton)
Классическая реализация Singleton'a с использованием статического поля класса не всегда подходит для ASP.NET: веб-сайт является приложением, которое запускается при первом запросе к нему и работает, пока в нём есть необходимость. Таким образом все пользователи веб-сайта будут использовать один и тот же экземпляр singleton'a, что не всегда желательно.
