How can I force WCF to autogenerate WSDLs with required method parameters (minoccurs="1")?

11,652

I've just written a Blog post about this subject, as I ran into the problem myself last week. It explains how you can modify the metadata that WCF generates at runtime.

Aside from downloading the source file, you only need to add an attribute to your contract definition. Like so:

[ServiceContract]
[RequiredParametersBehavior]
public interface ICalculatorService
{
    [OperationContract]
    int Add(int firstValue, int secondValue);
}

Here's the Blog post that explains it in more detail: Controlling WSDL minOccurs with WCF

Share:
11,652
DavidWhitney
Author by

DavidWhitney

David is the founder of Electric Head Software, working on an independent software consultant based in London focusing on IT software delivery, developer mentoring and cultural change - mostly working with London-based organizations and start-ups. David has previously served as the Technical Architect for JustGiving, and helped market-leading organizations such as JUST-EAT, Trainline, Euromoney and Vodafone improve their technical capabilities and culture across a variety of principal engineering and senior leadership roles. David is also the best-selling author of the book "Get Coding!" - a childrens programming book available worldwide, and it's successor Get Coding 2! - covering videogame programming for 9-14 year olds. There's a chance you've seen him talk at a spread of conferences, usergroups and code-dojos around the UK over the last decade, or indulged in bar-room programming debates after one. You can find his open source projects on NuGet and GitHub, follow him on Twitter @david_whitney, or check out his technical blog at http://www.davidwhitney.co.uk/Blog.

Updated on August 23, 2022

Comments

  • DavidWhitney
    DavidWhitney over 1 year

    While using WCF and OperationContracts I have the following method defined:

        [OperationContract]
        [FaultContract(typeof(ValidationFault))]
        [FaultContract(typeof(FaultException<ExceptionDetail>))]
        int DoSomething(int someId, MyComplexType messageData);
    

    When this gets translated to a WSDL by the WCF runtime, it ends up with with minoccurs="0" listed for the parameters someId and messageData (and subsequently throws a runtime error if these parameters are missing).

    If I generate a proxy using SoapUI I get something that looks like this:

      <com:DoSomething>
         <!--Optional-->
         <com:EventId>1</com:EventId>
         <!--Optional-->
         <com:myComplexType >
            <com:id>1</com:id>
         </com:myComplexType >
      </com:DoSomething>
    

    The id field in MyComplexType is marked up with DataMemeber attribute using IsRequired="true" and thus is exposed as mandatory.

    It's obviously quite misleading for the WSDL to specify that a parameter is optional when it isn't, but I can't see any obvious way to markup the OperationContract to force WCF to recognise and expose these parameters as required.

    I'm slightly baffled there doesn't seem an obvious way to do this (reading intellisense / msdn / google). Or I'm going blind and overlooking something obvious.

    Any clues?

  • Zack Jannsen
    Zack Jannsen over 10 years
    Interesting approach. Can you tell me if this works with all types (marshal by reference and marshal by value)? I know that nullable types tend to read up as challenges in generated xsd ... I am wondering if this applies to what you are doing as well. Say I was passing several required 'string' parameters.