关于在WCF中启用跟踪

时间:2014-02-14 08:26:52

标签: c# wcf

我浏览了这个msdn链接 http://msdn.microsoft.com/en-us/library/ms733025%28v=vs.110%29.aspx

这是完整设置

<configuration>
    <system.diagnostics>
        <sources>
            <source name="System.ServiceModel" 
                    switchValue="Information, ActivityTracing"
                    propagateActivity="true">
                <listeners>
                    <add name="xml" />
                </listeners>
            </source>
            <source name="CardSpace">
                <listeners>
                    <add name="xml" />
                </listeners>
            </source>
            <source name="System.IO.Log">
                <listeners>
                    <add name="xml" />
                </listeners>
            </source>
            <source name="System.Runtime.Serialization">
                <listeners>
                    <add name="xml" />
                </listeners>
            </source>
            <source name="System.IdentityModel">
                <listeners>
                    <add name="xml" />
                </listeners>
            </source>
        </sources>

        <sharedListeners>
            <add name="xml"
                 type="System.Diagnostics.XmlWriterTraceListener"
                 initializeData="c:\log\Traces.svclog" />
        </sharedListeners>
    </system.diagnostics>
</configuration>

但不明白

为什么这么多来源&amp;听众标签拥有多个来源&amp;的含义是什么?监听器标签??

如果可能请详细说明多个来源和&amp;配置设置中的监听器标签。

另一点是

我启用了跟踪,但未在此文件夹c:\log\Traces.svclog

中看到没有创建文件

所以有人建议我使用admin特权运行应用程序。当我将我的应用程序分发给任何人时,我怎么知道这个人有管理员特权?

指导我。感谢

2 个答案:

答案 0 :(得分:0)

好的,所以你有不同的来源,因为你可能想要在程序的不同部分记录问题/消息。对于WCF Web服务来说,最重要的是System.ServiceModel,因为它将捕获WCF输入/输出流量,但您可能还想记录序列化,IO或IdentityModel(身份验证/授权)的问题。因此,根据您的配置,您有五个源,所有这些源都将使用名为XML的共享侦听器,它将记录您的文本。简而言之,这就是正在发生的事情,但还有更多。

“看不到c:\ log \ Traces.svclog”...如果你的WCF服务正在运行并响应请求,你应该看到一些东西。如果没有,请确保您以“管理员”身份运行服务,或者您运行服务的ID对该文件夹具有读/写访问权限。

“当我将我的应用分发给任何人时,我怎么知道这个人有管理员特权?”好的,是的,我可以将此视为一个问题。这是一段代码,设置一个布尔值,您可以使用1)确定程序是否以“admin”运行,如果不是,则B)指示用户在正确的“admin”权限下重新启动程序:< / p>

private void GetServicePermissionLevel()
{
 bool bAdmin = false;
 try {
    SecurityIdentifier sidAdmin = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null);
    AppDomain myDomain = Thread.GetDomain();
    myDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
    WindowsPrincipal myPrincipal = (WindowsPrincipal)Thread.CurrentPrincipal;
    if (myPrincipal.IsInRole(sidAdmin)) {
        bAdmin = true;
    } else {
        bAdmin = false;
    }
   } catch (Exception ex) {
     throw new Exception("Error in GetServicePermissionlevel(): ");
   } finally {
     _ServiceRunAsAdmin = bAdmin;
   }
 }

此外,如果您尝试调试WCF服务中的主机端问题,则可能需要为Web主机接口启用此参数:IncludeExceptoinDetailsInFaults = True。默认情况下为false,但如果将其设置为true以显示有关WCF服务故障的更多信息,请确保在进入生产之前将其关闭。

以下是您的设置需要考虑的其他网址:http://www.topwcftutorials.net/2012/06/simple-steps-to-enable-tracing-in-wcf.html

答案 1 :(得分:0)

您的大多数问题都在链接文章中得到解答

System.ServiceModel.MessageLogging: Logs all messages that flow through the system.
System.Runtime.Serialization: Logs when objects are read or written.

等。您可以在不同的跟踪级别上记录不同的信息(例如,错误到数据库,警告到xml文件)。

到另一点:

您可以按要求提出请求管理员上下文,并在此处How to request administrator permissions when the program starts?

进行回答