【问题标题】:Error Operation not supported with my attributes knowntype我的属性 knowntype 不支持错误操作
【发布时间】:2019-08-17 18:28:34
【问题描述】:

我已经在链接Operation not supported in the WCF Test Client中读到了这篇文章

我尝试运行时出错

WCF GetBatch() 不支持该操作

这是我的课程如何解决这个问题

[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{}

界面

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

        [OperationContract]
        string AddBatch(Batch entityBatch);

        [OperationContract]
        string AddLocalBatch(string localPath);

        [OperationContract]
        string Ping();
    }

这是有效的方法

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 正在运行。

我不知道要在这个问题中添加什么。

我尝试了this link中的所有方法。

【问题讨论】:

  • GetBatch 可能没有OperationaContract 属性。查看示例用法here
  • 对不起,我没有显示我的界面,是的,有一个 OperationContract 和 ServiceContract
  • 请显示所有相关代码,并保留minimal reproducible example

标签: c# wcf c#-4.0 soap attributes


【解决方案1】:

WCFTestclient 不支持测试所有接口方法,例如上传文件流。也不代表方法定义错误,不能调用。 建议您直接以服务引用的形式将服务添加到项目中,然后测试是否有效。
KnownTypeAttribute 不适用于这种情况。因为您已明确指定数据协定类的属性的强类型,而不是基类型或接口。
如果有什么可以帮助的,请随时告诉我。

【讨论】:

  • 非常感谢!我认为这是我项目中的一个问题。但似乎非默认类型的错误是正常的
猜你喜欢
  • 2017-03-30
  • 1970-01-01
  • 2014-03-10
  • 1970-01-01
  • 1970-01-01
  • 2021-10-01
  • 2021-12-23
  • 2015-02-16
  • 1970-01-01
相关资源
最近更新 更多