Saturday, September 22, 2012

Remote Desktop Services is currently busy problem on windows7

Сталкнулся с ошибкой в Windows 2008 звучащей следующим образом
The task you are trying to do can't be completed because the Remote Desktop Services is currently busy. Please try again in a few minutes. Other users should still be able to log on.
 
И удалось найти решение в блоге http://sheltonial.blogspot.com.au/2011/02/windows-2008-r2-terminal-server-error.html
На всякий случай размещаю пост у себя.
Log onto the terminal server and open the Remote Desktop Services Manager.
  1. Select the terminal server you are logged onto in the left hand pane. (if you are logged on remotely you may not have sufficient permissions to end processes).
  2. Get the Session ID of the hung session(s)
  3. Click on the Sessions tab. Look for sessions which display the following characteristics (as the image above):
    - Session: Disconnected
    - User: [BLANK]
    - State: Disconnected
    - ClientName: [BLANK]
    - LogOnTime: Unknown
  4. Take note of the ID field. In the screen shot above this is "6".
  5. NOT REQUIRED: This step is not required but can be useful: If you right click on the session, click "Connect", enter a domain administrators password and click ok, you can connect to the session and can see at what stage the login has hung.
  6. Free the hung session(s)
  7. Click on the Processes tab, click on the ID column to sort the processes by ID. Scroll down through the list and find processes matching the ID gathered from the previous step (in this example "6")
  8. Commonly with this particular error, only 3 processes will be visible - LogonUI.exe, winlogon.exe, and csrss.exe
  9. Right click on winlogon.exe and click End Process. Once you end this process the other 2 should disappear. WARNING: do not end csrss.exe, this will crash and reboot your terminal server.
  10. Now get the user who was having difficulties logging on to try again.  

Wednesday, July 11, 2012

Класс для получения строки из Embeded Resources

Класс позволяющий получать строку из Embeded Resources. Удобно доставать sql из файлов в проекте.
    public class EmbeddedResource
    {
        private EmbeddedResource()
        {
        }

        public static StreamReader GetStream(System.Reflection.Assembly assembly, string name)
        {
            foreach (string resName in assembly.GetManifestResourceNames())
            {
                if (resName.EndsWith(name))
                {
                    return new System.IO.StreamReader(assembly.GetManifestResourceStream(resName));
                }
            }
            return null;
        }

        public static string GetString(System.Reflection.Assembly assembly, string name)
        {
            System.IO.StreamReader sr = EmbeddedResource.GetStream(assembly, name);
            string data = sr.ReadToEnd();
            sr.Close();
            return data;
        }

        public static string GetString(string name)
        {
            return EmbeddedResource.GetString(typeof (EmbeddedResource).Assembly, name);
        }
    }

Преобразование кодировки

Полезный код для преобразования кодировки строки:
        public static string Convert(string value, Encoding src, Encoding trg)
        {
            Decoder dec = src.GetDecoder();
            byte[] ba = trg.GetBytes(value);
            int len = dec.GetCharCount(ba, 0, ba.Length);
            var ca = new char[len];
            dec.GetChars(ba, 0, ba.Length, ca, 0);
            return new string(ca);
        }

Tuesday, June 5, 2012

Дубли объектов в коллеции

Получилось написать довольно полезный запрос на LINQ для выявления дублированных объектов в коллекции.
 var duplicates = from addr in Addresses
 group addr by new {addr.param1, addr.param2}
 into grp
 where grp.Count() > 1
 select new {grp.Key.param1, grp.Key.param2};
Addresses - это List<Address>, коллекция объектов типа адрес. У объекта есть 2 параметра по которым можно определить уникальность. Для группировки по нескольким параметрам используется такая конструкция:
group addr by new {addr.param1, addr.param2}
 В переменную duplicates попадет коллекция объектов с типом  <Anonymous Type> и парой значений addr.param1, addr.param2.


Friday, May 11, 2012

Простой метод подсчета хэша(md5):

public static string CalculateMD5Hash(string input)
        {
            // step 1, calculate MD5 hash from input
            MD5 md5 = System.Security.Cryptography.MD5.Create();
            byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
            byte[] hash = md5.ComputeHash(inputBytes);

            // step 2, convert byte array to hex string
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < hash.Length; i++)
            {
                sb.Append(hash[i].ToString("X2"));
            }
            return sb.ToString();
        }

Monday, February 6, 2012

Вызов веб-сервиса используя GET и POST

Иногда бывает нужно  сделать возможным вызов ws используя  http GET и POST.
Для этого в web.config достаточно добавить:
<system.web>
    <webServices>
      <protocols>
        <add name="HttpGet"/>
    <add name="HttpPost"/>
      </protocols>
    </webServices>
...
<system.web/>

http://stackoverflow.com/questions/618900/enable-asp-net-asmx-web-service-for-http-post-get-requests - как раз про это.

Thursday, February 2, 2012

Подсчет контрольной суммы файла

Простой метод подсчета контрольной суммы. Для данного кода нужны System.IO, System.Text 
и System.Security.Cryptography.
protected string GetMD5HashFromFile(string fileName)
{
  FileStream file = new FileStream(fileName, FileMode.Open);
  MD5 md5 = new MD5CryptoServiceProvider();
  byte[] retVal = md5.ComputeHash(file);
  file.Close();
 
  StringBuilder sb = new StringBuilder();
  for (int i = 0; i < retVal.Length; i++)
  {
    sb.Append(retVal[i].ToString("x2"));
  }
  return sb.ToString();
}

Monday, January 16, 2012

Хостинг wcf сервиса на IIS 7.5 на Win7 x64.


Наконец то разобрался как заставить wcf сервис работать на iis.

Для начала нужно поставить сам IIS, для этого в семерке идем в Control Panel ->

Programs and Features - > Turn Windows feature on or off. Там ставим нужные нам компоненты IISa.

Далее нужно создать виртуальный каталог и закинуть туда нужные файлы для работы веб-сервиса(папка bin с нашими библиотеками, а так же файл <ServiceName>.svc и  файл web.config).

Используя консоль IIS, делаем из нашей папки приложение, выбираем нужный нам app pool. Я выбрал ASP.NET v4.0, стандартный пул уже созданный IIS.

Затем я ставил компоненты WCF. Для этого используется  утилита ServiceModelReg.exe (ServiceModel Registration Tool). Найти ее можно %windir%\Microsoft.NET\Framework64\v4.0.30319 (для x64 win). Так же утилита лежит в папке c третьим фреймворком. (Нужно будет разобраться какие отличия). Подробнее про ServiceModelReg можно почитать на http://msdn.microsoft.com/en-us/library/aa751792.aspx.

После этого я попытался обратиться к сервису через браузер. По адресу http://localhost/wcfRequestService/Service1.svc . Получил ошибку вида  “Could not load type System.ServiceModel.Activation.HttpModule... “ и тд. Погуглив текст ошибки, нашел как справиться с проблемой :

If you install DotNet framework 4.0 on IIS server and then enable DotNet 3.0 or 3.5 WCF features, you might see following error when browse your application site made of ASP.NET 4.0 (or run on ASP.NET 4.0 application pool)

To resolve this issue, run the following from command line:
aspnet_regiis.exe /iru
Опять же aspnet_regiis лежит в той же папке с фреймворком %windir%\Microsoft.NET\Framework64\v4.0.30319.

Еще про деплой сервиса на IIS написано тут

Thursday, January 12, 2012

Сереализация через generic:
 
 
using System.Xml.Serialization;

public class SerializationHelper<T> where T : class
{
    public string SerializeXml(T o)
    {
        var serializer = new XmlSerializer(typeof(T));

        var sb = new StringBuilder();
        using (var tw = new StringWriter(sb))
        {
            serializer.Serialize(tw, o);
        }

        return sb.ToString();
    }

    public T DeserializeXml(string text)
    {
        var serializer = new XmlSerializer(typeof(T));

        using (var tr = new StringReader(text))
        {
            return (T)serializer.Deserialize(tr);
        }
    }
}

Wednesday, November 2, 2011

XmlSerializer example

Просто как шпаргалка, Xml сериализация, если память отобьет:

// This is the test class we want to
// serialize:[Serializable()]public class TestClass
{ private string someString;
public string SomeString
{ get { return someString; } set { someString = value; } }
private List<string> settings = new List<string>();
public List<string> Settings
{ get { return settings; } set { settings = value; } }
// These will be ignored [NonSerialized()] private int willBeIgnored1 = 1;
private int willBeIgnored2 = 1;

}
// Example code
// This example requires:// using System.Xml.Serialization;// using System.IO;
// Create a new instance of the test classTestClass TestObj = new TestClass();

// Set some dummy valuesTestObj.SomeString = "foo";

TestObj.Settings.Add("A");
TestObj.Settings.Add("B");
TestObj.Settings.Add("C");


#region Save the object
// Create a new XmlSerializer instance with the type of the test classXmlSerializer SerializerObj = new XmlSerializer(typeof(TestClass));

// Create a new file stream to write the serialized object to a fileTextWriter WriteFileStream = new StreamWriter(@"C:\test.xml");
SerializerObj.Serialize(WriteFileStream, TestObj);

// CleanupWriteFileStream.Close();

#endregion

/*The test.xml file will look like this: <?xml version="1.0"?><TestClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SomeString>foo</SomeString> <Settings> <string>A</string> <string>B</string> <string>C</string> </Settings></TestClass>
*/
#region Load the object
// Create a new file stream for reading the XML fileFileStream ReadFileStream = new FileStream(@"C:\test.xml", FileMode.Open, FileAccess.Read, FileShare.Read);

// Load the object saved above by using the Deserialize functionTestClass LoadedObj = (TestClass)SerializerObj.Deserialize(ReadFileStream);

// CleanupReadFileStream.Close();

#endregion

// Test the new loaded object:MessageBox.Show(LoadedObj.SomeString);

foreach (string Setting in LoadedObj.Settings) MessageBox.Show(Setting);