无法从Web服务访问公共类

时间:2018-04-27 13:42:53

标签: c# asp.net web-services

我有一个非常奇怪的场景,我似乎无法弄清楚发生了什么。我有一个用C#编写的Web服务,目标框架是3.5。我有很多类和方法但为了简单起见,我将在问题中只使用两个类。

public class PathNames
{
   private string _pathA = "Some Path";
   private string _pathB = "Another Path";
   public string BaseDirectoryPath
   {
        get
        {
            return Path.Combine(_pathA, _pathB); 
        }
   }
}

第二节课如下:

public class UserInformation
{
   public string UserName { get; set; }
   ...//more properties 
}

上述两个类都在同一个namespace中。

Web服务在WebForm应用程序中引用,目标框架为4.0。一切似乎都运行正常,当我在UserInformation中查看时,我可以看到Object Browser类。但是PathNames类似乎在Object Broswer中不可见。

有问题的两个源文件都在Compile窗口中设置为File Properties。我有5个类似于UserInformation的类和File Properties窗口中的相同设置,它们只是简单的POCO,只有公共汽车。这些都似乎正在通过,我可以访问它们并在Object Browser中看到它们。由于一些奇怪的原因,我不能PathNames上课。我试图添加一些新的虚拟类,并且与PathNames类具有相同的问题。有人可以告诉我,我做错了吗。

  1. Web服务旧ASMX

  2. 正在通过VS添加服务参考

  3. 创建Web服务客户端
  4. 使用VS 2017专业版 - 15.6.7版。

  5. 发布后,如果我对dll进行解编译,那么PathNames类就在那里。所以它显然在dll中。

  6. 我看过 this ,但仍然没有运气。

3 个答案:

答案 0 :(得分:4)

  

在网络服务中使用数据合同

服务不能公开私有/只读属性。 DataMember属性用于标记使用DataContract属性标记的类的公共成员或属性(带有公共getter和setter)。 DataContract可用作参数或操作的返回值。

Windows Communication Foundation( WCF 默认使用名为Data Contract Serializer的序列化引擎来序列化和反序列化数据(将数据转换为XML或从XML转换),以及< strong> XML序列化(默认情况下)不会序列化read = only属性。

有关详细信息,您可以阅读MS Docs for Data Contracts: - https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/using-data-contracts

要了解各种数据合同限制,请参阅: - https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/types-supported-by-the-data-contract-serializer

  

解决方案:

反正。你想做什么?公开属性意味着您期望某些有状态行为。 如果您打算在操作合同中使用此属性,那么您必须使用public getter和setter 定义属性,以便可以序列化。

正如Nikosi中所述的@ previous answer,您必须为BaseDirectoryPath属性定义公共设置器

答案 1 :(得分:2)

基于示例的唯一区别是,一个属性为.button-blue { height: 20px; width: 20px; background-color: blue; } .button-red { height: 20px; width: 20px; background-color: red; } ,而另一个属性可以修改。

为了使类可序列化,请考虑实现属性

readonly

您可以使用默认构造函数来设置属性的默认值

或者只是在属性上有一个空的setter

public class PathNames {
    private string _pathA = "Some Path";
    private string _pathB = "Another Path";

    public PathNames() {
        BaseDirectoryPath = Path.Combine(_pathA, _pathB);
    }

    public string BaseDirectoryPath { get; set; }
}

答案 2 :(得分:1)

您可以看到creating a Custom ASP.NET Web Service的方式。 您是否需要重建Web服务ASP.Net并将程序集添加到全局程序集缓存(GAC)。

我希望这对你有所帮助。