WCF 400 Bad request

Данная проблема начала возникать на моем сервисе. После гугления интернета наткнулся на то что она может проявляться из-за неверного представления адреса сервиса или из-за больших объемов данных. Есть наверняка и множество других причин, но в моем случае это был большой объем данных получаемый на входе сервисом.

Данную проблему можно решить двумя способами:
1 Посредством исправления web.config . Курсивом и жирным обозначено что нужно поправить. Веб конфиг необходимо править если вы развертываете сервис на своем IIS

<system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="WcfService2.Service1Behavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />          
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="WcfService2.Service1Behavior"
        name="WcfService2.Service1">
        <endpoint address="" binding="basicHttpBinding" bindingConfiguration="b1" contract="WcfService2.IService1">
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <bindings>
      <basicHttpBinding>
        <binding name="b1" maxReceivedMessageSize="2147483647">
          <readerQuotas maxDepth="2147483647"
                        maxStringContentLength="2147483647"
                        maxArrayLength="2147483647"
                        maxBytesPerRead="2147483647"
                        maxNameTableCharCount="2147483647" />

        </binding>
      </basicHttpBinding>
    </bindings>
  </system.serviceModel>

2 Второй способ актуален для тех кто развертывает сервис через new ServiceHost() . Почитать о нём можно тут . В данном случае мы меняем readerQuotas программно.

using (ServiceHost host = new ServiceHost(typeof(WCF_Lic_SA.ServiceLicSA), new Uri("http://localhost:8202/MyService")))
            {
                ServiceMetadataBehavior smb = new ServiceMetadataBehavior();

                smb.HttpGetEnabled = true;
                smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
                host.Description.Behaviors.Add(smb);
                host.Description.Behaviors.Find<ServiceDebugBehavior>().IncludeExceptionDetailInFaults = true;
                host.OpenTimeout = TimeSpan.FromSeconds(10);

                BasicHttpBinding b = new BasicHttpBinding();

                System.Xml.XmlDictionaryReaderQuotas myReaderQuotas = new System.Xml.XmlDictionaryReaderQuotas();
                myReaderQuotas.MaxArrayLength = 2147483647;
                myReaderQuotas.MaxBytesPerRead = 2147483647;
                myReaderQuotas.MaxDepth = 2147483647;
                myReaderQuotas.MaxNameTableCharCount = 2147483647;
                myReaderQuotas.MaxStringContentLength = 2147483647;
                b.ReaderQuotas = myReaderQuotas;
                b.MaxBufferPoolSize = 2147483647;
                b.MaxBufferSize = 2147483647;
                b.MaxReceivedMessageSize = 2147483647;

                host.AddServiceEndpoint(typeof(WCF_Lic_SA.IServiceLicSA), b, "");

                host.Open();
            }

Не удалось обновить зависимости проекта. Зависимости объекта <имя dll> не удается установить.


Вот нашел в блогах решение может кому поможет http://sharpgreat.blogspot.ru/2012/09/mydll.html

Мою ситуацию решило удаление "основные выходные файлы" из обозревателя решений VS.
После я заново добавил "основные выходные файлы" и всё заработало.

Потом ещё возникала проблема с обновлением каких то "действий" тоже проекте устновщика, тоже их решал удалением и обновлением новых ссылок.

Вообще вот много сообщений об ошибках из данной ситуации и пути их решения http://msdn.microsoft.com/ru-ru/library/yhteff89(v=vs.90).aspx

C# MSSQL Simple example Read data


using System;
using System.Data;
using System.Data.SqlClient;


class Program
{
    static void Main()
    {
        string str = "Data Source=(local);Initial Catalog=Northwind;"
            + "Integrated Security=SSPI";
        ReadOrderData(str);
    }

    private static void ReadOrderData(string connectionString)
    {
        string queryString =
            "SELECT OrderID, CustomerID FROM dbo.Orders;";

        using (SqlConnection connection =
                   new SqlConnection(connectionString))
        {
            SqlCommand command =
                new SqlCommand(queryString, connection);
            connection.Open();

            SqlDataReader reader = command.ExecuteReader();

            // Call Read before accessing data. 
            while (reader.Read())
            {
                ReadSingleRow((IDataRecord)reader);
            }

            // Call Close when done reading.
            reader.Close();
        }
    }

    private static void ReadSingleRow(IDataRecord record)
    {
        Console.WriteLine(String.Format("{0}, {1}", record[0], record[1]));
    }

}

SQL Compact connection string "Data Source=C:\userDB.sdf;Password=password;Persist Security Info=True"

In thos case dont forget to use CE components, for example System.Data.SqlServerCe.SqlCeConnection

101 Пример использования LINQ

Нашел ссылку, очень много полезных примеров применения LINQ http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b

с# Serialization to file or string / с# Сериализация в файл или в строку + Десериализация

static void SerializeToFile(object o)
{
  XmlSerializer serializer = new XmlSerializer(o.GetType());
  using (Stream writer = new FileStream("output.xml", FileMode.Create))
  {
    serializer.Serialize(writer, o);
  }
}

public static string SerializeToString(object obj)
        {
            XmlSerializer serializer = new XmlSerializer(obj.GetType());

            using (StringWriter writer = new StringWriter())
            {
                serializer.Serialize(writer, obj);

                return writer.ToString();
            }
        }
public static object DeserializeFromFile(object obj,string path)
{
  XmlSerializer serializer = new XmlSerializer(obj.GetType());
 
  using (XmlReader reader = XmlReader.Create(path))
  {
    object o = serializer.Deserialize(reader);
  }
}

//From string

var serializer = new XmlSerializer(typeof(Car));
using (var reader = new StringReader(xml))
{
    var car = (Car)serializer.Deserialize(reader);
}

Изменить строку подключения в app.conig / How to change connection string in app.config

static void AddConnectionStringMyDB()
        {
            System.Configuration.Configuration config =
                ConfigurationManager.OpenExeConfiguration(
                ConfigurationUserLevel.None);
            ConnectionStringsSection csSection =
              config.ConnectionStrings;
            ConnectionStringSettings connection = new ConnectionStringSettings();
            connection.Name = "Rozn_Client.Properties.Settings.userDBConnectionString";
            connection.ProviderName = "Microsoft.SqlServerCe.Client.4.0";
            connection.ConnectionString = "Data Source=|DataDirectory|\\myDB.sdf;Password=mypassword;Persist Security Info=True";
            csSection.ConnectionStrings.Add(connection);
            config.Save(ConfigurationSaveMode.Modified);
            ConfigurationManager.RefreshSection("connectionStrings");
        }

C# Get the version of your solution in Visual Studio

string s1 = Application.ProductVersion; //Only product version
string s2 = System.Reflection.Assembly.GetExecutingAssembly().FullName; // Returns Project1, Version=1.0.2281.26155, Culture=neutral, PubliKeyToken=null