ASP.NET Core encoding на кирилица като UTF-8

По подразбиране в ASP.NET Core 1.0/1.1 при визуализация на кирилица (всичко non Latin) в сорс-а на страницата се появява нещо подобно на това:

Това затруднява дебъгването и увеличава размера на страницата. По-странното е, че текст написан на кирилица в cshtml-a се показва правилно както е изписан.

Мислех, че е проблем с encoding-а на страницата или контролера или нещо друго, но всичко беше настроено на UTF-8.

В крайна сметка попаднах на дискусия в github: https://github.com/aspnet/HttpAbstractions/issues/315 . Там се обяснява, че по подразбиране се кодира в BasicLatin и съответно всичко останало се променя до UTF-8 като по-горе.

Решението е, да се добави следния код в Startup.cs:

Така и не ми стана ясно, защо default-a e BasicLatin, но вероятно има някаква важна причина, която в момента ми убягва

 

Одитиране на заявки с ASP.NET Core

Лесен начин за одитиране на заявки с ASP.NET Core компилиран от няколко различни сайта и модифициран да работи с Core

Няколко неща, които си заслужава да бъдат обяснени:

Използваме стандартното ASP.NET Core cookie, за да установим нещо като сесия за потребителя. Така получаваме всички действия извършени в хубав хронологичен ред.

Целта да прихванем и OnResultExecuted е да запишем колко време е отнело да се изпълни метода (полезно за разрешаване на проблеми от сорта на “Много е бавно”)

С предаване на параметри може да решим колко детайлно да запазим информация за съответния метод – параметри, query strings и т.н.

Използва се по следния начин в базовия controller (прави се по този начин, за да може да извикаме атрибута хем с DI, хем без параметри)

Допълнително разполагаме с property AuditId, което показва Id на съответния одит запис, в случай че искаме да добавим допълнителна информация в тялото на метода.

 

Например по следния начин:

 

Oracle .NET 2 provider разработка под Visual Studio 2013

Така, ето какво е положението:

  • стар код от .NET 3.5
  • използва Oracle .NET 2 provider
  • DataSet-и
  • трябва да се подкара спешно, а има налично само VS 2013

Резултатът е: Exception of type System.Data.Design.InternalException was thrown при отваряне на dataset и при build на проекта.

Повечете предложения за решения се ограничаваха до това, че в xsd файла има директни референции към Oracle Connection String и съответно те причиняват проблем. Това, не беше случая при мене, макар и да имаше доста коментари по Интернет, че решава проблема.

Почти бях изпаднал в безизходица докато не стигнах до http://blogs.msdn.com/b/psssql/archive/2011/04/21/conversion-issues-moving-from-vs-2005-to-vs-2008.aspx. Макар и подобен проблем, пътят до решението беше описан методично и точно! InternalException в System.Data.Design може да се появи само в два случая:

  • Cannot find provider factory named {0}
  • More than one data row for provider named {0}

Аха! И двата имаха нещо общо с provider и то вероятно Oracle-ския. Нещата започнаха да се избистрят – ODP.NET беше инсталиран, но само за 2.0, а VS 2013 използва .NET 4.5 и съответно друг CLR и не може да го намери design time.

И наистина в C:\windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\machine.config има

и

Ако тези секции се преместят и в machine.config за .NET 4 всичко, донякъде изненадващо, върви точно.

 

Разработка за Windows Phone 8 на машина без SLAT

Разработката за Windows Phone 8 изглежда логична стъпка за всеки разработчик на C# като се имат предвид следните предимства

  • Това е C# и Visual Studio 🙂
  • Таксата за регистрация е само 19$
  • След покупката на Nokia поне в обозримо бъдеще нещата изглеждат добре

Най-сериозния проблем е подкарването на емулатора за Windows Phone, тъй като той изисква Hyper-V, което автоматично означава, че е нужно Windows 8 или Windows Server 2012.

На Windows 8, за да се инсталира и работи правилно Hyper-V е необходима задължителна хардуерна виртуализация (сравнително достъпно от повечето PC-та), но и SLAT – i5, i7 и само някои i3 процесори. Почти всички Core2 Duo не поддържат тази възможност. Накратко, ако имате лаптоп по-стар от 2 години шансовете са, че няма да може да пуснете Hyper-V на Windows 8.

Какво пробвах и не работеше – всякакви предложени варианти по интернет, виртуални машини локално и в Azure – Hyper-V не може да се стартира, защото hypervisor is already present (абсолютно вярно).

Това, което се оказа решение (доколкото инсталирането на сървърна OS е решение) е да се използва Windows Server 2012 Standard (Foundation не върши работа, тъй като не поддържа Hyper-V). Тук няма нужда от SLAT, а само от хардуерна виртуализация и No Execute Bit.

В случай, че емулатора изкарва съобщение за грешка е нужно да се обнови VS 2012 до последния update (в момента това е 3)

 

.NET 3.5 SP1 Bootstrapper package във Visual Studio 2008 SP1

В долния документ има секция 2.3.1.1, в който е описано как да добавим .NET 3.5 SP1 като bootstrapper в ClickOnce и Setup проекти:

http://download.microsoft.com/download/A/2/8/A2807F78-C861-4B66-9B31-9205C3F22252/VS2008SP1Readme.htm

Новости в .NET 3.5 и Visual Studio 2008 (или по-скоро общ преглед)

Преди време ми се наложи да напиша две кратки статии за новостите в .NET 3.5 и Visual Studio 2008. Статиите така и не видяха бял свят и са далече от завършена фаза, но така или иначе вече са онлайн и са достъпни за сваляне във формат PDF на следните адреси:
Новости в .NET 3.5 и Visual Studio 2008.

По никакъв начин не претендират за изчерпателност или задълбочен анализ на материята.
Все пак през последните 4 месеца, откакто са написани известна част от схващанията ми са попроменени. Например:
– LINQ може би не е толкова “cool”, колкото ми изглеждаше в началото – да, идеално е за малки демо презентации, но не винаги успява в реалния свят
– Silverlight 1.0 е много далече от завършен продукт и за момента изостава от примерно Flex. Може би 2.0 ще обърне нещата – прогрес се забелязва в тази насока
– WCF – продължавам да не му схващам цялостната идея 🙂

 

Update (13.01.2016):

  • LINQ е “cool”, всъщност не минава ден без да го използвам – швейцрско ножче, което може всичко
  • WCF – ами… продължавам да не го харесвам, но вече го уважавам 🙂

Регистрация на Assembly в Windows GAC без gacutil.exe

В този блог http://blog.neutron.sharpstyle.com/2007/07/08/installing-assembly-into-the-gac-programmatically/ попаднах на информация как да регистрираме програмно .NET assembly в Windows GAC.
Всъщност това се оказа доста лесно и се постига с помощта само на един ред:

new
System.EnterpriseServices.Internal.Publish().GacInstall(”myassembly.dll”);

Как да направим Delphi 6 приложение, което да използва .NET Web Service

Започваме с реализацията на уеб метода на .NET във Visual Studio 2005. За да е съвсем ясно, за пример използвам един доста прост метод, който има за цел да направи log-in и връща като резултат дали потребителят има права.


[WebMethod(EnableSession = true)]

public bool LogIn(string aUserName, string aPassword)
{
bool IsAuthenticated;
// проверка дали дадения потребител се оторизира
….
return IsAuthenticated;
}

Предполагаме, че web service-a вече е качен на IIS/Cassini и е достъпен като http://localhost/test/Service.asmx

В Delphi 6 има wizard, който генерира прокси клас за работа с уеб услуги и той е достъпен от:
File->New->Other->Web Services

Стартира се WSDL Import Wizard-a и в началото се налага да се въведе WSDL кода, който за голяма радост се генерира автоматично от .NET чрез извикване на (за текущия пример):
http://localhost/test/Service.asmx?wsdl

Общо взето тук следва единствено натискане на Finish бутона и в крайна сметка получаваме един хубаво генериран proxy клас за работа с web service-a!

Вече може да поставим THTTPRIO компонентата за работа с web services и да се започне същинската работа.

Едно съвсем просто приложение би изглеждало така:


като настройките на THTTPRIO да показани тук:

И тук идва една малка изненада, тъй като .NET Web Services очакват параметрите си по различен начин отколкото е стандартния за Delphi, поради което е нужно да се добави следния ред в автогенерирания код на прокси класа:

initialization

InvRegistry.RegisterInvokeOptions(TypeInfo(ServiceSoap),ioDocument);

Вече няма проблеми с извикванията на .NET web service-a от Delphi код и се връща правилния резултат!