Spy.Core.xml

<?xml version="1.0"?>
<doc>
    <assembly>
        <name>Spy.Core</name>
    </assembly>
    <members>
        <member name="T:Spy.Core.Contracts.AssemblyReport">
            <summary>
            Complete scan report for a .NET assembly.
            </summary>
        </member>
        <member name="P:Spy.Core.Contracts.AssemblyReport.AssemblyPath">
            <summary>Gets or sets the path to the scanned assembly.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.AssemblyReport.AssemblyName">
            <summary>Gets or sets the assembly name.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.AssemblyReport.ScanTimestamp">
            <summary>Gets or sets the timestamp of the scan.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.AssemblyReport.Surfaces">
            <summary>Gets or sets all discovered input surfaces.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.AssemblyReport.SecurityIssues">
            <summary>Gets or sets the security issues found.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.AssemblyReport.TotalSurfaces">
            <summary>Gets the total number of input surfaces discovered.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.AssemblyReport.TotalHttpEndpoints">
            <summary>Gets the number of HTTP endpoints discovered.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.AssemblyReport.TotalSignalRMethods">
            <summary>Gets the number of SignalR methods discovered.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.AssemblyReport.TotalWcfOperations">
            <summary>Gets the number of WCF operations discovered.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.AssemblyReport.TotalGrpcOperations">
            <summary>Gets the number of gRPC operations discovered.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.AssemblyReport.TotalClasses">
            <summary>Gets the number of distinct classes found.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.AssemblyReport.AuthenticatedSurfaces">
            <summary>Gets the number of surfaces requiring authorization.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.AssemblyReport.AnonymousSurfaces">
            <summary>Gets the number of surfaces allowing anonymous access.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.AssemblyReport.TotalSecurityIssues">
            <summary>Gets the total number of security issues found.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.AssemblyReport.HighSeverityIssues">
            <summary>Gets the number of high-severity security issues.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.AssemblyReport.MediumSeverityIssues">
            <summary>Gets the number of medium-severity security issues.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.AssemblyReport.LowSeverityIssues">
            <summary>Gets the number of low-severity security issues.</summary>
        </member>
        <member name="M:Spy.Core.Contracts.AssemblyReport.ToString">
            <inheritdoc />
        </member>
        <member name="T:Spy.Core.Contracts.GrpcOperation">
            <summary>
            Represents an operation on a gRPC service.
            </summary>
        </member>
        <member name="P:Spy.Core.Contracts.GrpcOperation.SurfaceType">
            <inheritdoc />
        </member>
        <member name="P:Spy.Core.Contracts.GrpcOperation.ServiceName">
            <summary>Gets or sets the gRPC service name (e.g. "GreeterService").</summary>
        </member>
        <member name="P:Spy.Core.Contracts.GrpcOperation.MethodType">
            <summary>Gets or sets the gRPC method type (Unary, ServerStreaming, ClientStreaming, BidiStreaming).</summary>
        </member>
        <member name="P:Spy.Core.Contracts.GrpcOperation.DisplayRoute">
            <inheritdoc />
        </member>
        <member name="T:Spy.Core.Contracts.GrpcMethodType">
            <summary>
            Identifies the streaming mode of a gRPC method.
            </summary>
        </member>
        <member name="F:Spy.Core.Contracts.GrpcMethodType.Unary">
            <summary>Simple request-response.</summary>
        </member>
        <member name="F:Spy.Core.Contracts.GrpcMethodType.ServerStreaming">
            <summary>Server streams multiple responses.</summary>
        </member>
        <member name="F:Spy.Core.Contracts.GrpcMethodType.ClientStreaming">
            <summary>Client streams multiple requests.</summary>
        </member>
        <member name="F:Spy.Core.Contracts.GrpcMethodType.BidiStreaming">
            <summary>Both sides stream.</summary>
        </member>
        <member name="T:Spy.Core.Contracts.HttpEndpoint">
            <summary>
            Represents a discovered HTTP endpoint on an ASP.NET Core / Web API controller.
            </summary>
        </member>
        <member name="P:Spy.Core.Contracts.HttpEndpoint.SurfaceType">
            <inheritdoc />
        </member>
        <member name="P:Spy.Core.Contracts.HttpEndpoint.Route">
            <summary>Gets or sets the full route template for this endpoint.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.HttpEndpoint.HttpMethod">
            <summary>Gets or sets the HTTP method (GET, POST, PUT, DELETE, PATCH, etc.).</summary>
        </member>
        <member name="P:Spy.Core.Contracts.HttpEndpoint.RouteDetails">
            <summary>Gets or sets the route information.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.HttpEndpoint.DisplayRoute">
            <inheritdoc />
        </member>
        <member name="T:Spy.Core.Contracts.InputSurface">
            <summary>
            Abstract base class shared by all discoverable input surfaces.
            </summary>
        </member>
        <member name="P:Spy.Core.Contracts.InputSurface.SurfaceType">
            <summary>Gets the kind of input surface.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.InputSurface.ClassName">
            <summary>Gets or sets the class name (controller name, hub name, etc.).</summary>
        </member>
        <member name="P:Spy.Core.Contracts.InputSurface.MethodName">
            <summary>Gets or sets the method name.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.InputSurface.ReturnType">
            <summary>Gets or sets the return type of the method.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.InputSurface.IsAsync">
            <summary>Gets or sets whether the method is async.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.InputSurface.RequiresAuthorization">
            <summary>Gets or sets whether the surface requires authorization.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.InputSurface.AllowAnonymous">
            <summary>Gets or sets whether the surface explicitly allows anonymous access.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.InputSurface.Roles">
            <summary>Gets or sets the roles required to access this surface.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.InputSurface.Policies">
            <summary>Gets or sets the authorization policies applied to this surface.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.InputSurface.SecurityAttributes">
            <summary>Gets or sets the security attributes applied to this surface.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.InputSurface.Parameters">
            <summary>Gets or sets the parameters of the method.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.InputSurface.DisplayRoute">
            <summary>Gets the formatted display route for this surface (e.g. "GET api/users" or "WS chat/Send").</summary>
        </member>
        <member name="M:Spy.Core.Contracts.InputSurface.ToString">
            <inheritdoc />
        </member>
        <member name="T:Spy.Core.Contracts.ParameterSource">
            <summary>
            Specifies the binding source of a parameter.
            </summary>
        </member>
        <member name="F:Spy.Core.Contracts.ParameterSource.Unknown">
            <summary>Parameter source is unknown or not explicitly specified.</summary>
        </member>
        <member name="F:Spy.Core.Contracts.ParameterSource.Body">
            <summary>Parameter is bound from the request body.</summary>
        </member>
        <member name="F:Spy.Core.Contracts.ParameterSource.Query">
            <summary>Parameter is bound from the query string.</summary>
        </member>
        <member name="F:Spy.Core.Contracts.ParameterSource.Route">
            <summary>Parameter is bound from the route template.</summary>
        </member>
        <member name="F:Spy.Core.Contracts.ParameterSource.Header">
            <summary>Parameter is bound from a request header.</summary>
        </member>
        <member name="F:Spy.Core.Contracts.ParameterSource.Form">
            <summary>Parameter is bound from form data.</summary>
        </member>
        <member name="F:Spy.Core.Contracts.ParameterSource.Services">
            <summary>Parameter is bound from registered services.</summary>
        </member>
        <member name="T:Spy.Core.Contracts.EndpointParameterInfo">
            <summary>
            Represents a parameter on an HTTP endpoint action method.
            </summary>
        </member>
        <member name="P:Spy.Core.Contracts.EndpointParameterInfo.Name">
            <summary>Gets or sets the parameter name.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.EndpointParameterInfo.Type">
            <summary>Gets or sets the CLR type name of the parameter.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.EndpointParameterInfo.IsRequired">
            <summary>Gets or sets whether the parameter is required.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.EndpointParameterInfo.Source">
            <summary>Gets or sets the binding source of the parameter.</summary>
        </member>
        <member name="M:Spy.Core.Contracts.EndpointParameterInfo.ToString">
            <inheritdoc />
        </member>
        <member name="T:Spy.Core.Contracts.RouteInfo">
            <summary>
            Represents route information for an endpoint.
            </summary>
        </member>
        <member name="P:Spy.Core.Contracts.RouteInfo.ControllerRoute">
            <summary>Gets or sets the route template from the controller-level [Route] attribute.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.RouteInfo.ActionRoute">
            <summary>Gets or sets the route template from the action-level attribute.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.RouteInfo.CombinedRoute">
            <summary>Gets or sets the fully resolved route combining controller and action routes.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.RouteInfo.Area">
            <summary>Gets or sets the area name, if the controller belongs to an area.</summary>
        </member>
        <member name="M:Spy.Core.Contracts.RouteInfo.ToString">
            <inheritdoc />
        </member>
        <member name="T:Spy.Core.Contracts.SecurityAttribute">
            <summary>
            Represents security-related attributes applied to a controller or action.
            </summary>
        </member>
        <member name="P:Spy.Core.Contracts.SecurityAttribute.AttributeName">
            <summary>Gets or sets the attribute type name (e.g., "AuthorizeAttribute").</summary>
        </member>
        <member name="P:Spy.Core.Contracts.SecurityAttribute.Roles">
            <summary>Gets or sets the roles specified in the attribute, if any.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.SecurityAttribute.Policies">
            <summary>Gets or sets the policy names specified in the attribute, if any.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.SecurityAttribute.AuthenticationSchemes">
            <summary>Gets or sets the authentication schemes, if any.</summary>
        </member>
        <member name="M:Spy.Core.Contracts.SecurityAttribute.ToString">
            <inheritdoc />
        </member>
        <member name="T:Spy.Core.Contracts.SecuritySeverity">
            <summary>
            Severity level of a security issue.
            </summary>
        </member>
        <member name="F:Spy.Core.Contracts.SecuritySeverity.Info">
            <summary>Informational finding.</summary>
        </member>
        <member name="F:Spy.Core.Contracts.SecuritySeverity.Low">
            <summary>Low severity issue.</summary>
        </member>
        <member name="F:Spy.Core.Contracts.SecuritySeverity.Medium">
            <summary>Medium severity issue.</summary>
        </member>
        <member name="F:Spy.Core.Contracts.SecuritySeverity.High">
            <summary>High severity issue.</summary>
        </member>
        <member name="F:Spy.Core.Contracts.SecuritySeverity.Critical">
            <summary>Critical severity issue.</summary>
        </member>
        <member name="T:Spy.Core.Contracts.SecurityIssue">
            <summary>
            Represents a security vulnerability or misconfiguration found in an input surface.
            </summary>
        </member>
        <member name="P:Spy.Core.Contracts.SecurityIssue.Title">
            <summary>Gets or sets the short title of the security issue.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.SecurityIssue.Description">
            <summary>Gets or sets the detailed description of the issue.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.SecurityIssue.Severity">
            <summary>Gets or sets the severity level.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.SecurityIssue.SurfaceRoute">
            <summary>Gets or sets the display route of the affected surface (e.g. "GET api/users" or "WS chat/Send").</summary>
        </member>
        <member name="P:Spy.Core.Contracts.SecurityIssue.SurfaceType">
            <summary>Gets or sets the type of input surface where the issue was found.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.SecurityIssue.Recommendation">
            <summary>Gets or sets the recommended remediation.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.SecurityIssue.ClassName">
            <summary>Gets or sets the class name of the affected surface.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.SecurityIssue.MethodName">
            <summary>Gets or sets the method name of the affected surface.</summary>
        </member>
        <member name="M:Spy.Core.Contracts.SecurityIssue.ToString">
            <inheritdoc />
        </member>
        <member name="T:Spy.Core.Contracts.SignalRMethod">
            <summary>
            Represents a callable method on a SignalR hub.
            </summary>
        </member>
        <member name="P:Spy.Core.Contracts.SignalRMethod.SurfaceType">
            <inheritdoc />
        </member>
        <member name="P:Spy.Core.Contracts.SignalRMethod.HubRoute">
            <summary>Gets or sets the conventional hub route (e.g. "chat" for ChatHub).</summary>
        </member>
        <member name="P:Spy.Core.Contracts.SignalRMethod.HubName">
            <summary>Gets or sets the hub class name.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.SignalRMethod.IsStreamingResult">
            <summary>Gets or sets whether the method returns a streaming result (IAsyncEnumerable, ChannelReader).</summary>
        </member>
        <member name="P:Spy.Core.Contracts.SignalRMethod.AcceptsStreaming">
            <summary>Gets or sets whether the method accepts a streaming parameter.</summary>
        </member>
        <member name="P:Spy.Core.Contracts.SignalRMethod.DisplayRoute">
            <inheritdoc />
        </member>
        <member name="T:Spy.Core.Contracts.SurfaceType">
            <summary>
            Identifies the kind of input surface discovered in an assembly.
            </summary>
        </member>
        <member name="F:Spy.Core.Contracts.SurfaceType.HttpEndpoint">
            <summary>An HTTP endpoint on an ASP.NET Core / Web API controller.</summary>
        </member>
        <member name="F:Spy.Core.Contracts.SurfaceType.SignalRMethod">
            <summary>A callable method on a SignalR hub.</summary>
        </member>
        <member name="F:Spy.Core.Contracts.SurfaceType.WcfOperation">
            <summary>An operation on a WCF service contract.</summary>
        </member>
        <member name="F:Spy.Core.Contracts.SurfaceType.GrpcOperation">
            <summary>An operation on a gRPC service.</summary>
        </member>
        <member name="T:Spy.Core.Contracts.WcfOperation">
            <summary>
            Represents an operation on a WCF service contract.
            </summary>
        </member>
        <member name="P:Spy.Core.Contracts.WcfOperation.SurfaceType">
            <inheritdoc />
        </member>
        <member name="P:Spy.Core.Contracts.WcfOperation.ContractName">
            <summary>Gets or sets the service contract interface name (e.g. "IOrderService").</summary>
        </member>
        <member name="P:Spy.Core.Contracts.WcfOperation.ServiceNamespace">
            <summary>Gets or sets the namespace from [ServiceContract(Namespace=...)].</summary>
        </member>
        <member name="P:Spy.Core.Contracts.WcfOperation.IsOneWay">
            <summary>Gets or sets whether this is a one-way operation from [OperationContract(IsOneWay=true)].</summary>
        </member>
        <member name="P:Spy.Core.Contracts.WcfOperation.DisplayRoute">
            <inheritdoc />
        </member>
        <member name="T:Spy.Core.Helpers.ReflectionHelper">
            <summary>
            Shared reflection utilities used by discovery implementations.
            </summary>
        </member>
        <member name="M:Spy.Core.Helpers.ReflectionHelper.GetTypesSafe(System.Reflection.Assembly)">
            <summary>
            Safely loads all types from an assembly, handling partial load failures.
            </summary>
        </member>
        <member name="M:Spy.Core.Helpers.ReflectionHelper.IsAsyncMethod(System.Reflection.MethodInfo)">
            <summary>
            Determines whether a method is async (returns Task, Task&lt;T&gt;, ValueTask, or ValueTask&lt;T&gt;).
            </summary>
        </member>
        <member name="M:Spy.Core.Helpers.ReflectionHelper.IsNullableType(System.Type)">
            <summary>
            Determines whether a type is nullable (Nullable&lt;T&gt; or reference type).
            </summary>
        </member>
        <member name="M:Spy.Core.Helpers.ReflectionHelper.GetFriendlyTypeName(System.Type)">
            <summary>
            Returns a human-friendly name for a CLR type.
            </summary>
        </member>
        <member name="M:Spy.Core.Helpers.ReflectionHelper.GetParameters(System.Reflection.MethodInfo,Spy.Core.Services.AttributeAnalyzer)">
            <summary>
            Builds parameter info for a method's parameters.
            </summary>
        </member>
        <member name="T:Spy.Core.Services.AssemblyScanner">
            <summary>
            Orchestrates assembly scanning, surface discovery, and security analysis.
            </summary>
        </member>
        <member name="M:Spy.Core.Services.AssemblyScanner.#ctor(Spy.Core.Services.IDiscovery[])">
            <summary>
            Initializes a new instance of <see cref="T:Spy.Core.Services.AssemblyScanner"/>.
            </summary>
        </member>
        <member name="M:Spy.Core.Services.AssemblyScanner.ScanAssembly(System.String)">
            <inheritdoc />
        </member>
        <member name="M:Spy.Core.Services.AssemblyScanner.ScanAssembly(System.Reflection.Assembly)">
            <inheritdoc />
        </member>
        <member name="M:Spy.Core.Services.AssemblyScanner.AnalyzeSecurityIssues(System.Collections.Generic.List{Spy.Core.Contracts.InputSurface})">
            <summary>
            Analyzes all input surfaces for security issues.
            </summary>
        </member>
        <member name="T:Spy.Core.Services.AttributeAnalyzer">
            <summary>
            Analyzes security-related attributes on controllers and actions using reflection.
            </summary>
        </member>
        <member name="M:Spy.Core.Services.AttributeAnalyzer.HasAuthorizeAttribute(System.Reflection.MemberInfo)">
            <inheritdoc />
        </member>
        <member name="M:Spy.Core.Services.AttributeAnalyzer.HasAllowAnonymousAttribute(System.Reflection.MemberInfo)">
            <inheritdoc />
        </member>
        <member name="M:Spy.Core.Services.AttributeAnalyzer.GetSecurityAttributes(System.Reflection.MemberInfo)">
            <inheritdoc />
        </member>
        <member name="M:Spy.Core.Services.AttributeAnalyzer.GetRoles(System.Reflection.MemberInfo)">
            <inheritdoc />
        </member>
        <member name="M:Spy.Core.Services.AttributeAnalyzer.GetPolicies(System.Reflection.MemberInfo)">
            <inheritdoc />
        </member>
        <member name="M:Spy.Core.Services.AttributeAnalyzer.GetHttpMethod(System.Reflection.MethodInfo)">
            <inheritdoc />
        </member>
        <member name="M:Spy.Core.Services.AttributeAnalyzer.GetRouteTemplate(System.Reflection.MemberInfo)">
            <inheritdoc />
        </member>
        <member name="M:Spy.Core.Services.AttributeAnalyzer.GetArea(System.Type)">
            <inheritdoc />
        </member>
        <member name="M:Spy.Core.Services.AttributeAnalyzer.GetParameterSource(System.Reflection.ParameterInfo)">
            <inheritdoc />
        </member>
        <member name="T:Spy.Core.Services.GrpcDiscovery">
            <summary>
            Discovers gRPC service methods by scanning for types that inherit from a generated gRPC base class.
            </summary>
        </member>
        <member name="M:Spy.Core.Services.GrpcDiscovery.#ctor(Spy.Core.Services.AttributeAnalyzer)">
            <summary>
            Initializes a new instance of <see cref="T:Spy.Core.Services.GrpcDiscovery"/>.
            </summary>
        </member>
        <member name="P:Spy.Core.Services.GrpcDiscovery.SurfaceType">
            <inheritdoc />
        </member>
        <member name="M:Spy.Core.Services.GrpcDiscovery.Discover(System.Reflection.Assembly)">
            <inheritdoc />
        </member>
        <member name="M:Spy.Core.Services.GrpcDiscovery.IsGrpcService(System.Type)">
            <summary>
            Detects whether a type is a gRPC service implementation.
            A gRPC service inherits from a generated base class whose parent declares a static BindService method.
            </summary>
        </member>
        <member name="M:Spy.Core.Services.GrpcDiscovery.DetermineMethodType(System.Reflection.MethodInfo)">
            <summary>
            Determines the gRPC method type from its parameter signature.
            </summary>
        </member>
        <member name="M:Spy.Core.Services.GrpcDiscovery.GetUserParameters(System.Reflection.MethodInfo)">
            <summary>
            Extracts user-meaningful parameters, excluding ServerCallContext and stream reader/writer params.
            </summary>
        </member>
        <member name="T:Spy.Core.Services.HttpEndpointDiscovery">
            <summary>
            Discovers HTTP endpoints by scanning for ASP.NET Core / Web API controllers.
            </summary>
        </member>
        <member name="M:Spy.Core.Services.HttpEndpointDiscovery.#ctor(Spy.Core.Services.AttributeAnalyzer)">
            <summary>
            Initializes a new instance of <see cref="T:Spy.Core.Services.HttpEndpointDiscovery"/>.
            </summary>
        </member>
        <member name="P:Spy.Core.Services.HttpEndpointDiscovery.SurfaceType">
            <inheritdoc />
        </member>
        <member name="M:Spy.Core.Services.HttpEndpointDiscovery.Discover(System.Reflection.Assembly)">
            <inheritdoc />
        </member>
        <member name="T:Spy.Core.Services.IDiscovery">
            <summary>
            Discovers input surfaces of a specific type within a .NET assembly.
            </summary>
        </member>
        <member name="P:Spy.Core.Services.IDiscovery.SurfaceType">
            <summary>Gets the surface type this discovery implementation handles.</summary>
        </member>
        <member name="M:Spy.Core.Services.IDiscovery.Discover(System.Reflection.Assembly)">
            <summary>Discovers all input surfaces of this type in the given assembly.</summary>
        </member>
        <member name="T:Spy.Core.Services.ScannerFactory">
            <summary>
            Creates a fully wired <see cref="T:Spy.Core.Services.AssemblyScanner"/> with all discovery implementations.
            </summary>
        </member>
        <member name="M:Spy.Core.Services.ScannerFactory.Create">
            <summary>
            Creates an <see cref="T:Spy.Core.Services.AssemblyScanner"/> configured with all built-in discovery types.
            </summary>
        </member>
        <member name="T:Spy.Core.Services.SecurityResolver">
            <summary>
            Resolves merged security attributes from a class and its method.
            </summary>
        </member>
        <member name="M:Spy.Core.Services.SecurityResolver.ReadClass(System.Reflection.MemberInfo)">
            <summary>
            Reads security attributes from a class (controller/hub) level.
            </summary>
        </member>
        <member name="M:Spy.Core.Services.SecurityResolver.Merge(Spy.Core.Services.SecurityResolver.ClassSecurity,System.Reflection.MethodInfo)">
            <summary>
            Merges class-level and method-level security into a resolved result.
            </summary>
        </member>
        <member name="T:Spy.Core.Services.SignalRDiscovery">
            <summary>
            Discovers SignalR hub methods by scanning for types that inherit from Hub or Hub&lt;T&gt;.
            </summary>
        </member>
        <member name="M:Spy.Core.Services.SignalRDiscovery.#ctor(Spy.Core.Services.AttributeAnalyzer)">
            <summary>
            Initializes a new instance of <see cref="T:Spy.Core.Services.SignalRDiscovery"/>.
            </summary>
        </member>
        <member name="P:Spy.Core.Services.SignalRDiscovery.SurfaceType">
            <inheritdoc />
        </member>
        <member name="M:Spy.Core.Services.SignalRDiscovery.Discover(System.Reflection.Assembly)">
            <inheritdoc />
        </member>
        <member name="T:Spy.Core.Services.WcfDiscovery">
            <summary>
            Discovers WCF service operations by scanning for interfaces with [ServiceContract].
            </summary>
        </member>
        <member name="M:Spy.Core.Services.WcfDiscovery.#ctor(Spy.Core.Services.AttributeAnalyzer)">
            <summary>
            Initializes a new instance of <see cref="T:Spy.Core.Services.WcfDiscovery"/>.
            </summary>
        </member>
        <member name="P:Spy.Core.Services.WcfDiscovery.SurfaceType">
            <inheritdoc />
        </member>
        <member name="M:Spy.Core.Services.WcfDiscovery.Discover(System.Reflection.Assembly)">
            <inheritdoc />
        </member>
    </members>
</doc>