WebService派生的基类中的继承WebServiceAttribute未显示在asmx页面上

时间:2014-08-02 01:47:43

标签: c# web-services inheritance attributes

我有一个包含标准Web服务基类的库项目。然后,我继承了实现Web服务的特定网站的基类。

这是一个简化的例子:

[WebService(
     Namespace = "http://CanI.InheritThis.com/",
     Name = "WebServiceBaseClass",
     Description = "This Webservice is overloaded on specific websites")]
public abstract class CustomWebServiceBase : WebService
{
    //shared web service guts
}

public class MyService : CustomWebServiceBase
{
     //overloaded items
}

当我打开myservice.asmx时,它仍然说我正在使用默认命名空间(http://tempuri.org)。如何让webservice显示继承的命名空间(http://CanI.InheritThis.com/)?

更新: 我尝试创建一个继承自WebServiceAttribute类的自定义属性,但发现WebServiceAttribute已被密封。

有没有办法将Inherited = true添加到WebServiceAttribute

更新2: 更令人困惑的是我遵循J0e3gan的建议并在linqpad中创建了以下内容(添加了System.Web.Services.dll并添加了命名空间。

void Main()
{
    Console.WriteLine(typeof(MyService).GetCustomAttributes().First());
}
[WebService(
     Namespace = "http://CanI.InheritThis.com/",
     Name = "WebServiceBaseClass",
     Description = "This Webservice is overloaded on specific websites")]
public abstract class CustomWebServiceBase : WebService
{
    //shared web service guts
}

public class MyService : CustomWebServiceBase
{
     //overloaded items
}

其中说它获得了正确的属性,但是asmx页面仍声称使用了默认命名空间。

更新3: 从头开始重新启动,检查bitbucket,同样的问题 更新4:正如@ J0e3gan指出的那样,bitbucket项目缺少类库,我已经解决了这个问题。

2 个答案:

答案 0 :(得分:1)

初步答复

WebServiceAttribute已经通过应用它的类的子类支持它的继承。

也许您只需要重建您的图书馆和服务项目? related SO question概述了一些其他可能性,可以解释为什么浏览到您的服务仍显示默认命名空间http://tempuri.org/

请参阅以下LINQPad 4程序(引用System.Web.Services.dll并导入System.Web.Services名称空间),以获取应用于基类的WebServiceAttribute示例,其中子类继承并覆盖属性:

void Main()
{
    Console.WriteLine(typeof(CustomWebServiceBase).GetCustomAttributes().First());
    Console.WriteLine(typeof(SomeSiteService).GetCustomAttributes().First());
    Console.WriteLine(typeof(AnotherSiteService).GetCustomAttributes().First());
}

[WebService(
     Namespace = "http://CanI.InheritThis.com/",
     Name = "WebServiceBaseClass",
     Description = "This Webservice is overloaded on specific websites")]
public class CustomWebServiceBase : WebService
{
}

public class SomeSiteService : CustomWebServiceBase
{
}

[WebService(
     Namespace = "http://YesU.Can.AndOverride.it/",
     Name = "WebServiceDerivedClass",
     Description = "This Webservice is for a specific website")]
public class AnotherSiteService : CustomWebServiceBase
{
}

它产生以下输出:

WebServiceAttribute Inheritance Results

Bitbucket解决方案的后续行动

查看显示问题的Bitbucket解决方案,我可以通过按原样构建和运行它来重现它:

Issue Rero

要解决此问题,我只需使用MyServiceWebServiceAttribute项目MyServiceWebApp)对MyService.asmx.cs进行装饰,如下所示:

// NOTE: necessary using directive - requiring a corresponding reference to
// System.Web.Services.dll
using System.Web.Services;

namespace MyServiceWebApp
{
    // NOTE: the key - the overriding decoration of the derived web-service
    // class with WebServiceAttribute
    [WebService(
     Namespace = "http://YesU.Can.AndOverride.it/",
     Name = "WebServiceDerivedClass",
     Description = "This Webservice is for a specific website")]
    public class MyService : WebServiceClassLibrary.CustomWebServiceBase
    {

    }
}

以下是修补程序结果的屏幕截图:

Issue Fix

Issue Fix - WSDL

Issue Fix - HelloWorld Operation

您可以清楚地看到MyService.asmx不再报告默认命名空间http://tempuri.org/,并且其WSDL显示其默认命名空间现在是http://YesU.Can.AndOverride.it/

答案 1 :(得分:0)

您要应用的自定义属性需要配置为[AttributeUsage(System.AttributeTargets.Class, Inherited = true)]

参见上一个帖子

How does inheritance work for attribtues?