Локализация Windows 8 и Windows Phone приложений с помощью Multilingual App Toolkit

Перед началом нужно выключить Multilingual App Toolkit    для проекта. Для этого нужно выделить проект зайти в меню Tool и выбрать там Enable Multilingual App Toolkit. 

Для простой локализации достаточно сделать следующее:
1. Создать папку Resources.
2. В ней создать папки с культурами для которых есть локализация например: en-US(Для  Multilingual App Toolkit   обязательно должен быть en-US именно его он и переводит на другие языки).
3. В папке с культурой создать файл с ресурсами ( .resw ) например loc.resw.
4. Использовать в коде, указав в скобках нужный ресурс ( например у вас локализация разбита на несколько файлов)

var loader = new Windows.ApplicationModel.Resources.ResourceLoader("loc");
tbx.Text += loader.GetString("test");

Если имя файла ресуров Resources.resw
То его имя можно не указывать:

var loader = new Windows.ApplicationModel.Resources.ResourceLoader();
tbx.Text += loader.GetString("test");

 Для XAML нужно использовать UID

<TextBlock x:Uid="Greeting" Text="" />

А в файле ресурсов имя должно быть Greeting.Text

Фишка Multilingual App Toolkit  в том что он позволяет переводить ваши уже созданные ресурсы на разные языки.
Теперь подробнее как это сделать:
1. Установить Multilingual App Toolkit  (ссылка ниже)
2. Зайти в Tools и выбрать Enable Multilingual App Toolkit 
3. Нажать правой кнопкой на проекте и выбрать Add Translation Language
4. Выбрать нужные языки.
5. У вас появиться файлы в папке MultilingualResources
6. Сделать ребил проекта.
7. Когда вы попытаетесь открыть файлы .xlf то увидете там строки из ваших ресурсов.
8. Теперь нужно перевести эти строки, можно отправить переводчику, все это есть в MSDN ссылке.
9. Нажать сохранить в редакторе.

Дальше все работает само. Важный момент английский язык все таки берётся из вашего оригинального файла локализации.

 А для задания языка можно сделать так:

Windows.Globalization.ApplicationPreferences.PreferredLanguage = "en";
this.Frame.Navigate(this.GetType());

Текущий язык можно получить из CultureInfo.

также еще можно сделать так:

public static String appForceCulture = "qps-PLOC"; 
// тут должна быть локаль (например ru-RU)
Thread.CurrentThread.CurrentCulture = 
new CultureInfo(appForceCulture);

 

 

 MSDN:

 http://blogs.msdn.com/b/developer-tools-rus/archive/2012/11/21/visual-studio-2012-windows.aspx

 http://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh965329.aspx

 http://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh965323.aspx

 

Далее: http://msdn.microsoft.com/en-us/library/windows/apps/jj569303.aspx

Если у вас не стоит Multilingual App Toolkit for Visual Studio 2012 то его можно скачать отсюда:

http://msdn.microsoft.com/en-us/windows/apps/hh848309

 

еще:

http://blogs.windows.com/windows_phone......-apps-part1.aspx

http://blogs.windows.com/windows_phone/b/wpdev/archive.....-phone-apps-part-2.aspx

Локализация Windows Phone приложений

Для того чтобы локализовать ваше приложение вам нужны файлы с ресурсами (resx) в которых находиться строки локализации.
1. Для начала в проекте нужно создать папку Resources.
2. В ней создать файл ресурсов AppResources.resx (тут будет локализация по умолчанию).
3. Дальше жмем правкой кнопкой мыши на проекте, выбираем Properties. В разделе Application и в блоке Supported Cultures отмечаем галочками языки которые мы будем поддерживать. Студия сама создаст файлы ресурсов с нужными именами.
4. Открываем созданные файлы ресурсов в верху  в Access Modifier ставим Public чтобы иметь доступ к ресурсам их кода.
После этих действий нужно пересобрать проект.

Доступ к ресурсам в коде:
1. Добавить в using  ссылку на ресурсы:

using WPTestApp.Resources;


И испльзовать в коде, ��бращаясь по имени которое находиться в файле ресуровс в столбике Name:

string str =  AppResources.test;

Доступ к ресурсам в XAML разметке:
1. Для начала нам нужно сделать класс для получения строк из файла ресурсов:

namespace WPTestApp.Resources
{
public class AppResourcesHelper
{
private static AppResources appRes = new AppResources();
public AppResources AppResources
{
get { return appRes; }
}
}
}


2. Дальше в App.xaml нужно добавить в раздел  Application:

xmlns:res="clr-namespace:WPTestApp.Resources"


3. И в Applocation.Resources добавить:

<Application.Resources>
<ResourceDictionary>
<res:AppResourcesHelper x:Key="AppResourcesHelper"></res:AppResourcesHelper>
</ResourceDictionary>
</Application.Resources>


4.Использование:

<TextBlock x:Name="ApplicationTitle" 
Text="{Binding Path=AppResources.test, 
Source={StaticResource AppResourcesHelper}}"/>

 

Для локализации название приложения (App Title) нужно:

Скачать прекрасное приложение которое будет генерировать нам файлы ресурсов
Вот отсюда: http://patrickgetzmann.wordpress.com/wp7-localize/
В этой программе мы указываем название приложения, далее оно его автоматически переводить на другие языки, мы если хотим то правим и жмем Save DLLs.

После чего получаем библиотек и кучу файлов, для удобства положим их в папку Resources (или еще куда), добавим их в проект, для всех файлов укажем что Build Action – Content.
Далее, идем в папку Properties и открываем WMAppManifest.xml.
В поле Display Name пишем - @Resources/AppResLib.dll,-100
А в Tile Title - @Resources/AppResLib.dll,-200
Главное без пробелов.

 Все. Теперь в зависимости от локали вы получите локализированное называние приложения.

Описание форматов C# String.Format()

Выравнивание:
String.Format(“->{1,10}<-”, “Hello”); -> Hello<-
String.Format(“->{1,-10}<-”, “Hello”); ->Hello <-

 

String.Format("{0:00}",i);

Числа:

Базовые спецификаторы: 

Specifier Type Format Output (Passed Double 1.42) Output (Passed Int -12400)
c Currency {0:c} $1.42 -$12,400
d Decimal (Whole number) {0:d} System.FormatException -12400
e Scientific {0:e} 1.420000e+000 -1.240000e+004
f Fixed point {0:f} 1.42 -12400.00
g General {0:g} 1.42 -12400
n Number with commas for thousands {0:n} 1.42 -12,400
r Round trippable {0:r} 1.42 System.FormatException
x Hexadecimal {0:x4} System.FormatException cf90

Дополнительные спецификаторы:

Specifier Type Example Output (Passed Double 1500.42) Note
0 Zero placeholder {0:00.0000} 1500.4200 Pads with zeroes.
# Digit placeholder {0:(#).##} (1500).42  
. Decimal point {0:0.0} 1500.4  
, Thousand separator {0:0,0} 1,500 Must be between two zeroes.
,. Number scaling {0:0,.} 2 Comma adjacent to Period scales by 1000.
% Percent {0:0%} 150042% Multiplies by 100, adds % sign.
e Exponent placeholder {0:00e+0} 15e+2 Many exponent formats available.
; Group separator see below    

 

Дата и время:

Обратите внимание, что форматирование даты зависит от региональных настроек системы.

Specifier Type Example (Passed System.DateTime.Now)
d Short date 10/12/2002
D Long date December 10, 2002
t Short time 10:11 PM
T Long time 10:11:29 PM
f Full date & time December 10, 2002 10:11 PM
F Full date & time (long) December 10, 2002 10:11:29 PM
g Default date & time 10/12/2002 10:11 PM
G Default date & time (long) 10/12/2002 10:11:29 PM
M Month day pattern December 10
r RFC1123 date string Tue, 10 Dec 2002 22:11:29 GMT
s Sortable date string 2002-12-10T22:11:29
u Universal sortable, local time 2002-12-10 22:13:50Z
U Universal sortable, GMT December 11, 2002 3:13:50 AM
Y Year month pattern December, 2002

The ‘U’ specifier seems broken; that string certainly isn’t sortable.

Дополнительное форматирование даты:

Specifier Type Example Example Output
dd Day {0:dd} 10
ddd Day name {0:ddd} Tue
dddd Full day name {0:dddd} Tuesday
f, ff, … Second fractions {0:fff} 932
gg, … Era {0:gg} A.D.
hh 2 digit hour {0:hh} 10
HH 2 digit hour, 24hr format {0:HH} 22
mm Minute 00-59 {0:mm} 38
MM Month 01-12 {0:MM} 12
MMM Month abbreviation {0:MMM} Dec
MMMM Full month name {0:MMMM} December
ss Seconds 00-59 {0:ss} 46
tt AM or PM {0:tt} PM
yy Year, 2 digits {0:yy} 02
yyyy Year {0:yyyy} 2002
zz Timezone offset, 2 digits {0:zz} -05
zzz Full timezone offset {0:zzz} -05:00
: Separator {0:hh:mm:ss} 10:43:20
/ Separator {0:dd/MM/yyyy} 10/12/2002

Перечисления:

 

Specifier Type
g Default (Flag names if available, otherwise decimal)
f Flags always
d Integer always
x Eight digit hex.

Пример:

String.Format(“{0:$#,##0.00;($#,##0.00);Zero}”, value);

This will output “$1,240.00″ if passed 1243.50. It will output the same format but in parentheses if the number is negative, and will output the string “Zero” if the number is zero.

String.Format(“{0:(###) ###-####}”, 8005551212);

This will output “(800) 555-1212″.

Подробнее:

http://blog.stevex.net/string-formatting-in-csharp/

http://msdn.microsoft.com/ru-ru/library/26etazsy.aspx

Параметры функции C# .ToString()

Перевод чисел в денежную валюту (Currency). Результат зависит от региональных настроек операционной системы: 

double number1 = 45.7;
string currency1 = number1.ToString("c"); // Значение: 47,70р. или $47.70 и т.д.
double number2 = 45.74;
string currency2 = number2.ToString("c3"); // Значение: 45.745р. или $47.745 и т.д.


 Отображение разрядов у целочисленного числа (Digital)

int number = 45;
string digits = number.ToString("d"); // Значение: "45"         
int number2 = -136;
string digits2 = number2.ToString("d6"); // Значение: "-000136"


 

Отображение чисел после плавающей точки (Fixed-point)

double number1 = 45.123;
string float1 = number1.ToString("f"); // Значение: "45,12" (рус) 
double number2 = -45.1;s
tring float2 = number2.ToString("f3"); // Значение: "-45,100" (рус)


 

Отображение разделителей групп (Number)

double number = -55645.1;
string group = number.ToString("n"); // Значение: "-55 645,10" (рус)


 

Отображение процентов (Percent) 
 

double number1 = 0.45;
string percent1 = number1.ToString("p"); // Значение: "45,00%" (рус) 
double number2 = -0.451;
string percent2 = number2.ToString("p1"); // Значение: "-45,1%" (рус)


 

Отображение целочисленного значения в 16-разрядной системе (Hexademal)

 

int number1 = 255;
string hex1 = number1.ToString("x"); // Значение: "ff" 
int number2 = 255;
string hex2 = number2.ToString("X"); // Значение: "FF" 
int number3 = 255;
string hex3 = number3.ToString("X8"); // Значение: "000000FF"

Кроме этого можно управлять форматом чисел:

i.ToString("00");

 Это значит что  например чило "5" будет представлено как "05".

 

 Таблица с MSDN в которой представлены форматы: 

Описатель формата

Имя

Описание

Примеры

"0"

Знак-заместитель нуля

Заменяет ноль соответствующей цифрой, если такая имеется. В противном случае в результирующей строке будет стоять ноль.

Дополнительные сведения: Настраиваемый описатель "0".

1234.5678 ("00000") -> 01235

0.45678 ("0.00", en-US) -> 0.46

0.45678 ("0.00", fr-FR) -> 0,46

"#"

Заместитель цифры

Заменяет знак "#" соответствующей цифрой, если такая имеется. В противном случае в результирующей строке цифра стоять не будет.

Дополнительные сведения: Настраиваемый описатель "#".

1234.5678 ("#####") -> 1235

0.45678 ("#.##", en-US) -> .46

0.45678 ("#.##", fr-FR) -> ,46

"."

Разделитель

Определяет расположение разделителя целой и дробной частей в результирующей строке.

Дополнительные сведения см. в разделе Настраиваемый описатель ".".

0.45678 ("0.00", en-US) -> 0.46

0.45678 ("0.00", fr-FR) -> 0,46

","

Разделитель групп и масштабирование чисел

Служит в качестве описателя разделителя групп и описателя масштабирования чисел. В качестве разделителя групп вставляет локализованный символ-разделитель групп между всеми группами. В качестве описателя масштабирования чисел делит число на 1000 для всех указанных запятых.

Дополнительные сведения: Настраиваемый описатель ",".

Описатель разделителя групп:

2147483647 ("##,#", en-US) -> 2,147,483,647

2147483647 ("##,#", es-ES) -> 2.147.483.647

Описатель масштабирования:

2147483647 ("#,#,,", en-US) -> 2,147

2147483647 ("#,#,,", es-ES) -> 2.147

"%"

Заместитель процентов

Умножает число на 100 и вставляет локализованный символ процента в результирующую строку.

Дополнительные сведения: Настраиваемый описатель "%".

0.3697 ("%#0.00", en-US) -> %36.97

0.3697 ("%#0.00", el-GR) -> %36,97

0.3697 ("##.0 %", en-US) -> 37.0 %

0.3697 ("##.0 %", el-GR) -> 37,0 %

"‰"

Местозаполнитель промилле

Умножает число на 1000 и вставляет локализованный символ промилле в результирующую строку.

Дополнительные сведения: Настраиваемый описатель "‰".

0.03697 ("#0.00‰", en-US) -> 36.97‰

0.03697 ("#0.00‰", ru-RU) -> 36,97‰

"E0"

"E+0"

"E-0"

"e0"

"e+0"

"e-0"

Экспоненциальная нотация

Если за этим описателем следует по меньшей мере один ноль (0), результат форматируется с использованием экспоненциальной нотации. Регистр ("E" или "e") определяет регистр символа экспоненты в результирующей строке. Минимальное число цифр экспоненты определяется количеством нулей, стоящих за символом "E" или "e". Знак "+" указывает на то, что перед экспонентой всегда должен ставиться символ знака. Знак "-" указывает на то, что символ знака должен ставиться только в случае, если экспонента имеет отрицательное значение.

Дополнительные сведения: Настраиваемые описатели "E" и "e".

987654 ("#0.0e0") -> 98.8e4

1503.92311 ("0.0##e+00") -> 1.504e+03

1.8901385E-16 ("0.0e+00") -> 1.9e-16

\

Escape-символ

Указывает на то, что следующий за ним символ должен рассматриваться как литерал, а не как описатель настраиваемого формата.

Дополнительные сведения: Escape-символ "\".

987654 ("\###00\#") -> #987654#

'строка'

"строка"

Разделитель строк-литералов

Указывает на то, что заключенные в разделители символы должны быть скопированы в результирующую строку без изменений.

68 ("# ' градусов'") -> 68 градусов

68 ("#' градусов'") -> 68 градусов

;

Разделитель секций

Определяет секции с раздельными строками формата для положительных чисел, отрицательных чисел и нуля.

Дополнительные сведения: Разделитель секций ";".

12.345 ("#0.0#;(#0.0#);-\0-") -> 12.35

0 ("#0.0#;(#0.0#);-\0-") -> -0-

-12.345 ("#0.0#;(#0.0#);-\0-") -> (12.35)

12.345 ("#0.0#;(#0.0#)") -> 12.35

0 ("#0.0#;(#0.0#)") -> 0.0

-12.345 ("#0.0#;(#0.0#)") -> (12.35)

Другой

Все остальные символы

Символ копируется в р��зультирующую строку без изменений.

68 ("# °") -> 68 °


 

 Подробнее:

http://msdn.microsoft.com/ru-ru/library/0c899ak8.aspx

http://dotnetways.com/sharpbook/tostring/

 

Как получить и обработать UnhandledException

Иногда в вашем приложении может возникнуть необработанное исключение, которое приведет к краху приложения.
Для этого нужно подписаться на UnhandledException


Для WPF, Silverlight и подобных:

AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);
static void MyHandler(object sender, UnhandledExceptionEventArgs args)
{
Assembly assem = Assembly.GetExecutingAssembly();
AssemblyName assemName = assem.GetName();
Exception e = (Exception)args.ExceptionObject;
//необходимые действия
}

Для ASP.NET в фале Global.asax:

protected void Application_Error(Object sender, EventArgs e)
{
Exception ex = Server.GetLastError();
Assembly assem = Assembly.GetExecutingAssembly();
AssemblyName assemName = assem.GetName();
//необходимые действияServer.ClearError();
}

Стоит заметить, что Application_Error вызывается в случае любой ошибки, в том числе когда нет нужной страницы и т.п.

Как получить IP клиента в WCF Service

Чтобы получить IP подключенного клиента нужно сделать:

 

OperationContext context = OperationContext.Current;
MessageProperties messageProperties = context.IncomingMessageProperties;
RemoteEndpointMessageProperty endpointProperty = 
messageProperties[RemoteEndpointMessageProperty.Name] 
as RemoteEndpointMessageProperty;
String ClientIP = endpointProperty.Address;

Динамическое создание переменных в C# и работы с ними.

Получение списка классов в сборке:
Тут мы получаем список классов в интересущем нас пространстве имен, можно также указать конкретный класс, или что либо еще.

String namespace = "ClassLibrary1.SomeNamspace";
var  library = (AppDomain.CurrentDomain.GetAssemblies().
Where(w => w.FullName.Contains(namespace)))

 Получение списка полей в классе:
Тип свойства можно указывать, скажем мы хотим получить публичные свойства.

Type type = library.GetType("ClassName");
PropertyInfo[] properties = 
type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
foreach (PropertyInfo property in properties)
{
string propertyName = property.Name;
}

 Создание динамической переменной:

var currentType = (from i in library.GetTypes()
where i.FullName.Contains("CurrentClassName")
select i).FirstOrDefault();
var variable = Activator.CreateInstance(currentType); //создали перменную

 Записать данные в переменную:

currentType.GetProperty("ClassPropertyName").
SetValue(variable, "Новое значение свойства", null);

 Взять данные из переменной:

string getProperty = (string)currentType.GetProperty("ClassProperyName").
GetValue(variable, null);

Бинарная сериализция и десерилазиция обьтектов C#

Сериализация:

BinaryFormatter serializer = new BinaryFormatter();
using (MemoryStream s = new MemoryStream())
{
serializer.Serialize(s, ИМЯ_ПЕРЕМЕННОЙ_ДЛЯ_СЕРИАЛИЗАЦИИ);
s.ToArray();// получили сериалзиованный массив.
}

Десириализация:

BinaryFormatter serializer = new BinaryFormatter();
using (MemoryStream s = new MemoryStream(ИМЯ_ПЕРЕМЕННОЙ_ДЛЯ_ДЕСЕРИАЛИЗАЦИИ))
{
var newVariable = serializer.Deserialize(s); //создали переменную
}

C# wpf настройка формата даты для приложения

Например: 

CultureInfo ci = new CultureInfo("ru-RU");
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;

А чтобы получить культуру:

var culture = new CultureInfo
(Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName);

Или можно сделать так:

public MainWindow()
{
InitializeComponent();
this.Language = XmlLanguage.GetLanguage(
CultureInfo.CurrentCulture.IetfLanguageTag);
}

Счетчики производительности PerformanceCounter в C#

Важное замечание, чтобы счетчики давали правдивые результаты их нужно объявить один раз и после этого к ним обращаться скажем по таймеру. Если вы будете постоянно создавать заново счетчики то они будут возвращать значение – 0. Так как им нужно время для сбора данных.
Я приведу пример четырех счетчиков: Процессора, памяти, файла подкачки и сети.

 

public partial class MainWindow : Window
{
PerformanceCounter cpuUsage;
PerformanceCounter memUsage;
PerformanceCounter pageUsage;
List<PerformanceCounter> netUsage = null;
System.Timers.Timer tmr;
public MainWindow()
{
InitializeComponent();
cpuUsage = new PerformanceCounter("Processor", "% Processor Time", "_Total");
memUsage = new PerformanceCounter("Memory", "Available MBytes");
netUsage = GetNetCounters();
pageUsage = new PerformanceCounter("Paging File", "% Usage", "_Total");
tmr = new System.Timers.Timer();
tmr.Elapsed += tmr_Elapsed;
tmr.Interval = 1000;
tmr.Start();
}
void tmr_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
Dispatcher.BeginInvoke(new ThreadStart(delegate
{
cont.Children.Clear();
cont.Children.Add(new Label() { Content = "Processor " + cpuUsage.NextValue()+ " %" });
cont.Children.Add(new Label() { Content = "memory free  " + memUsage.NextValue() +" mb"});
//добавить System.Management
string Query = "SELECT MaxCapacity FROM Win32_PhysicalMemoryArray";
ManagementObjectSearcher searcher = new ManagementObjectSearcher(Query);
foreach (ManagementObject WniPART in searcher.Get())
{
UInt32 SizeinKB = Convert.ToUInt32(WniPART.Properties["MaxCapacity"].Value);
UInt32 SizeinMB = SizeinKB / 1024;
UInt32 SizeinGB = SizeinMB / 1024;
cont.Children.Add(new Label() { Content = "memory " + ((memUsage.NextValue() / SizeinMB)*100)+"% used" });
cont.Children.Add(new Label() { Content = "memory used " + (SizeinMB - memUsage.NextValue())});
cont.Children.Add(new Label() { Content = "page used " + pageUsage.NextValue() });
foreach (var item in netUsage)
{
cont.Children.Add(new Label() { Content = "network  " + item.NextValue() });
}
}
}));
}
private List<PerformanceCounter> GetNetCounters()
{
string filter = "MS TCP Loopback interface";
List<string> nics = new List<string>();
PerformanceCounterCategory category = new PerformanceCounterCategory("Network Interface", System.Environment.MachineName);
if (category.GetInstanceNames() != null)
{
foreach (string nic in category.GetInstanceNames())
{
if (!nic.Equals(filter, StringComparison.InvariantCultureIgnoreCase))
{ nics.Add(nic); }
}
List<PerformanceCounter> nicCounters = new List<PerformanceCounter>();
foreach (string nicInstance in nics)
{
nicCounters.Add(new PerformanceCounter("Network Interface", "Bytes Total/sec", nicInstance, System.Environment.MachineName));
}
return nicCounters;
}
else
{
return null;
}
}
}

Счетчики использую стандартные системные счетчики с которых они и берут данные.

Подробнее о счетчиках:

http://msdn.microsoft.com/en-us/library/ms998581.aspx

http://technet.microsoft.com/en-us/library/cc938593.aspx

http://blogs.msdn.com...setting-up-performance-counters-in-your-web-and-worker-roles.aspx

Увеличение размеров пакетов в WCF Service.

Иногда бывает так что ваш ответ от сервера слишком большой и клиент говорит что превышен максимальный размер сообщение в 65536.
В таком случае в app.config (или web.config) клиента нужно указать максимальный размер сообщения которое может получить клиент, например - maxReceivedMessageSize="2147483647"  - это примерно 2GB. Это максимальное значение.
 

<bindings>
<basicHttpBinding>
<binding name="userHttp" maxReceivedMessageSize="2147483647">
<security mode="None" />
</binding>
<binding name="StreamedBinding" transferMode="Streamed" maxReceivedMessageSize="2147483647" />
</basicHttpBinding>
</bindings>

Так же стоит упомянть о таймаутах:

 

<binding name="BasicHttpBinding_IReportService" 
closeTimeout="00:10:00" 
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" maxReceivedMessageSize="2147483647">
</binding>

closeTimeout, openTimeout, receiveTimeout, sendTimeout – задают время за которые должна выполниться операция. Если вы получаете и отправляете большие данные то возможно вам это понадобиться. По умолчанию значение 00:01:00 – что значит одна минута.

Отладка WCF сервисов

Если ваш WCF сервис не работает, и вы мне можете запустить его из отладчика Visual Studio, а в ошибке клиента приходит что-то типа «включите includeExceptionDetailInFaults»
Тогда нужно вклчить его, указав параметр includeExceptionDetailInFaults="true". Для этого в web.config сервера нужно найти секцию behaviors -> serviceBehaviors и включить там эту опцию:

<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
<behavior name="">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>

Вот примерно так как указано в примере, в первом случае у меня includeExceptionDetailInFaults выключена, а во втором включена. После этого в отладчике клиента вы получите информацию об ошибке.