【发布时间】:2010-09-14 14:43:33
【问题描述】:
我正在尝试从 javascript 调用 ASP.NET .asmx Web 服务,使用的不是 Visual Studio 在创建它时使用的默认命名空间。
当我使用 Visual Studio 向导创建一个名为 Hello 的 Web 服务时,它会在文件夹 WebServices 中创建:
namespace MyWebSite.WebServices
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[System.Web.Script.Services.ScriptService]
public class Hello : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
}
}
它对浏览器中的 javascript 可见,如下所示:
ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page);
ServiceReference serviceReference = new ServiceReference();
serviceReference.Path = "~/WebServices/Hello.asmx";
serviceReference.InlineScript = false;
scriptManager.Services.Add(serviceReference);
它是这样从 Javascript 调用的:
MyWebSite.WebServices.Hello.HelloWorld(function(rval){{alert(rval);}});
效果很好。我的问题是我的调用 javascript 在一个单独的程序集中,作为服务器控件的一部分,它需要不同的命名空间。我要么需要重新设计程序集的工作方式——以某种方式使 web 服务的命名空间成为参数,要么我需要更改 web 服务的命名空间,以便它与调用匹配。
目前,我正在探索后者。 (因为更改程序集将意味着更改也使用此程序集的其他网站,我宁愿不这样做,除非有必要)。
所以,我希望我的 Javascript 调用看起来像这样:
OtherNamespace.WebServices.Hello.HelloWorld(function(rval){{alert(rval);}});
我以为我可以更改 .asmx 文件中的命名空间:
namespace OtherNamespace.WebServices
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
...
但这不起作用。我收到“未定义其他命名空间”错误。显然,尽管 .asmx 文件中的命名空间和 javascript 调用中的前缀具有相同的值,但它们引用的不是相同的东西。
MyWebSite.WebServices 在哪里。前缀,在调用 javascript 是从哪里来的?它在哪里定义?我怎样才能改变它,让它变成别的东西?
【问题讨论】:
-
您在进行更改后是否更新了您的网络参考?
标签: javascript asp.net web-services asmx