我有一个包含标准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项目缺少类库,我已经解决了这个问题。
答案 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
{
}
它产生以下输出:
查看显示问题的Bitbucket解决方案,我可以通过按原样构建和运行它来重现它:
要解决此问题,我只需使用MyService
(WebServiceAttribute
项目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
{
}
}
以下是修补程序结果的屏幕截图:
您可以清楚地看到MyService.asmx
不再报告默认命名空间http://tempuri.org/
,并且其WSDL显示其默认命名空间现在是http://YesU.Can.AndOverride.it/
。
答案 1 :(得分:0)
您要应用的自定义属性需要配置为[AttributeUsage(System.AttributeTargets.Class, Inherited = true)]
参见上一个帖子