Search code examples
c#wcfc#-4.0soapattributes

Error Operation not supported with my attributes knowntype


I already read this in link Operation not supported in the WCF Test Client

Error while I try running this

the operation is not supported in the WCF GetBatch()

This is my Classes how to fix this

[KnownType(typeof(Contract))]
[KnownType(typeof(TotalAmount))]
[KnownType(typeof(SubjectRole))]
[KnownType(typeof(ContractData))]
[KnownType(typeof(MonthlyPayment))]
[KnownType(typeof(ProlongationAmount))]
[DataContract]
public class Batch
{
    private string batchIdentifierField;
    private Contract contractField;
    [DataMember]
    public string BatchIdentifier
    {
        get { return this.batchIdentifierField;}
        set { this.batchIdentifierField = value;}
    }

    [DataMember]
    public Contract Contract
    {
        get { return this.contractField;}
        set { this.contractField = value;}
    }
}

[DataContract(Name = "Contract")]
public partial class Contract
{
\\\other fields
  [DataMember]
  public ContractData ContractData{get;set;}
  [DataMember]
  public SubjectRole[] SubjectRole{get;set;}
\\\other fields
}

[DataContract(Name = "ContractData")]
public partial class ContractData
{
\\\other fields
  [DataMember]
  public TotalAmount TotalAmount{get;set;}

  [DataMember]
  public MonthlyPayment TotalMonthlyPayment{get;set;}

  [DataMember]
  public ProlongationAmount ProlongationAmount{get;set;}
\\\other fields
}

[DataContract(Name = "TotalAmount")]
public partial class TotalAmount{}

[DataContract(Name = "MonthlyPayment")]
public partial class MonthlyPayment{}

[DataContract(Name = "ProlongationAmount")]
public partial class ProlongationAmount{}

Interface

[ServiceContract]
    public interface IBankService
    {
        [OperationContract]
        Batch GetBatch(string DateTime);

        [OperationContract]
        string AddBatch(Batch entityBatch);

        [OperationContract]
        string AddLocalBatch(string localPath);

        [OperationContract]
        string Ping();
    }

And this is Methods which doesn't work

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using ModelContract;
using DABatch;

namespace WCF_Service
{
    // Realization my Methods
public class BankService : IBankService
{
    public Batch GetBatch(string datetime)
    {
        try
        {
            DateTime date = DateTime.Parse(datetime); 
            if (datetime.IsEmpty())
                {
                Debug.WriteLog("Field Datetime is Empty");
                return new Batch();
            }

            using (BatchContext db = new BatchContext())
            {
                if (db.DBBatches.Any(x => x.Contract.ContractData.StartDate.Equals(date)))
                {
                    //.......
                    return ChangedBatch;
                }
                else
                {
                    //Just insert Time and create new object
                    //......
                    return newBatch;
                }
            }
        }
        catch(Exception ex)
        {
            Debug.WriteLog(ex.Message);
            return new Batch();
        }
    }

    public string AddBatch(Batch entityBatch)
    {
        try
        {
            if (entityBatch == null)
            {
                Debug.WriteLog("Batch entity is Empty", new NullReferenceException());
                return "Error : Batch entity is Empty, nothing to Load";
            }

            using (BatchContext db = new BatchContext())
            {
                db.DBBatches.Add(entityBatch);
                return "Add Operation Success!";
            }
        }
        catch(Exception ex)
        {
            Debug.WriteLog(ex.Message);
            return string.Format($"Error : {ex.Message}");
        }
    }

    public string AddLocalBatch(string localPath)
    {
        try
        {
            if (localPath.IsEmpty())
            {
                Debug.WriteLog("Link is Empty");
                return "Error : Link is Empty, nothing to Load";
            }

            var entityBatch = XmlReader.Read(localPath);

            using (BatchContext db = new BatchContext())
            {
                db.DBBatches.Add(entityBatch);
                return "Add Operation Success!";
            }
        }
        catch (Exception ex)
        {
            Debug.WriteLog(ex.Message);
            return string.Format($"Error : {ex.Message}");
        }
    }

    public string Ping()
    {
        return string.Format($"Service is working. OK! Date : {DateTime.Now.ToLongDateString()} Time: {DateTime.Now.ToLongTimeString()}");
    }
}

AddLocalBatch is Working.

I don't know what to add in this question.

I tried every method in this link.

WCF is Running


Solution

  • WCFTestclient does not support testing all interface methods, such as uploading file streams. Nor does it mean that the method definition is wrong and cannot be called. I recommend that you add the service directly to the project in the form of a service reference, and then test whether it works.
    KnownTypeAttribute does not apply to this situation. Because you have explicitly specified the strong type of the property of the data contract class, not the base type, or the interface.
    Feel free to let me know if there is anything I can help with.