← back to index

S3597 — "ServiceContract" and "OperationContract" attributes should be used together

Language: C#  |  Type: CODE_SMELL  |  Severity: Major

Tags: api-design

Why is this an issue?

The ServiceContract attribute specifies that a class or interface defines the communication contract of a Windows Communication Foundation (WCF) service. The service operations of this class or interface are defined by OperationContract attributes added to methods. It doesn’t make sense to define a contract without any service operations; thus, in a ServiceContract class or interface at least one method should be annotated with OperationContract. Similarly, WCF only serves OperationContract methods that are defined inside ServiceContract classes or interfaces; thus, this rule also checks that ServiceContract is added to the containing type of OperationContract methods.

Noncompliant code example

[ServiceContract]
interface IMyService // Noncompliant
{
  int MyServiceMethod();
}

Compliant solution

[ServiceContract]
interface IMyService
{
  [OperationContract]
  int MyServiceMethod();
}