Существует ли класс C # для отслеживания вызовов методов службы, таких как трассировка стека - PullRequest
2 голосов
/ 01 декабря 2011

Я знаю, что, конечно, есть трассировка стека для отслеживания вызовов методов в вашей программе, однако она не показывает вызов метода в сервисе как часть трассировки.Существуют ли какие-либо встроенные функции в .NET для распознавания вызова службы WCF и последующего сохранения имени вызываемого метода?

Например, у нас есть метод ниже:

private void DoStuff()
{
    object  =  Service.ServiceMethodCall();
}

По трассировке стека, которую я вижу, я могу восстановить имя DoStuff () и другие детали, но не ServiceMethodCall ().Я не хочу просто жестко кодировать имя этого метода в моем выводе.Должен быть лучший способ.

Спасибо

Ответы [ 2 ]

2 голосов
/ 01 декабря 2011

Если вы пытаетесь диагностировать проблемы в WCF, вы можете использовать встроенную функцию трассировки WCF, которая, по нашему мнению, необходима для этого. Чтобы сделать это (при условии, что WCF размещен в IIS), добавьте в web.config следующее:

  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel"
              switchValue="Information, ActivityTracing"
              propagateActivity="true">
        <listeners>
          <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData="c:\log\WebTrace.svclog"  />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>

Если вы отлаживаете и используете VS Ultimate 2010, вы также можете использовать IntelliTrace .

Наконец, если вы просто пытаетесь отследить источник возникающих исключений, дамп StackTrace в исключении покажет вам источник ошибки, предполагая, что вызов службы WCF является единственным методом в цепочке, который содержит обработчик исключений. Наши практики разработки обязывают, что, если не существует чрезвычайных, документированных обстоятельств, только самый внешний вызов (т. Е. Запись службы WCF) будет содержать обработчик исключений. Это обеспечивает значительное сокращение времени, необходимого для диагностики и исправления ошибок.

Обновление

Похоже, что System.Runtime.Reflection.GetCurrentMethod может предоставить информацию, которую вы ищете.

0 голосов
/ 01 декабря 2011

Похоже, ваш механизм протоколирования записывает ваш текущий метод на основе трассировки стека. Трассировка стека говорит вам, куда будет идти ваш код после завершения выполнения текущего метода, а не то, какие вызовы методов вы уже сделали. Кроме того, это может быть не совсем точно, потому что JIT может встроить вещи или может произойти дополнительная оптимизация.

WCF имеет встроенных опций трассировки , но это может быть излишним для того, что вы просите. В противном случае вам нужно будет явно указать имя метода самостоятельно. Это действительно зависит от того, как работает ваш механизм ведения журналов, в отношении наилучшей реализации. По крайней мере, вы можете просто выполнить трассировку с помощью строки или настроить оболочку для вызовов службы, которая отслеживает имя для вас.

Trace.WriteLine("ServiceMethodCall");

...