【问题标题】:Call an IIS Web Service without the .asmx extension调用不带 .asmx 扩​​展名的 IIS Web 服务
【发布时间】:2009-03-04 03:33:30
【问题描述】:

我编写了一个 .NET Web 服务,供不受我控制的客户端使用(我的服务器是用 PHP 编写的实时服务器的模拟器)。 Web 服务按需要工作,但客户端无法在其调用中添加 .asmx 扩​​展名或任何与此相关的扩展名。他们基本上使用http://localhost/soap/MyWebService,而IIS 需要http://localhost/soap/MyWebService.asmx。有没有办法让 IIS 响应没有 .asmx 扩​​展名的请求?

【问题讨论】:

    标签: .net web-services iis asmx


    【解决方案1】:

    添加通配符映射,它将通过 ASP.NET 路由所有请求:

    http://professionalaspnet.com/archive/2007/07/27/Configure-IIS-for-Wildcard-Extensions-in-ASP.NET.aspx

    您还需要进行一些 URL 重写,以允许传入请求 http://localhost/soap/MyWebService 映射到 http://localhost/soap/MyWebService.asmx

    http://weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-rewriting-with-asp-net.aspx

    基本上,您可以在 Application_BeginRequest 方法中添加类似以下内容:

    string path = Request.Path;
    if (path.Contains("/soap/") && !path.EndsWith(".asmx"))
        Context.RewritePath(path + ".asmx");
    

    我还没有测试过它(它是一个 HACK),但它应该能让你开始。

    【讨论】:

    • 虽然此解决方案确实有效,但它仅适用于运行 IIS 6 或更高版本的系统。
    • 可以在 IIS 5.x 中添加通配符映射,但步骤不同。
    • 是的,您可以将通配符映射添加到 IIS 5.x,但在涉及 Web 服务时存在一个错误,您将收到关于不允许动词的错误。该错误在 ASP.net 留言板上得到了很好的说明。
    • 我只使用 Application_BeginRequest 部分。
    【解决方案2】:

    你也可以把它单独放在一个目录中,然后在 IIS 中将它设置为默认文档。

    在服务器上:C:/mywebsite.com/mywebservice/mywebservice.asmx

    在 IIS 中将 mywebservice.asmx 设置为默认文档

    网上:http://mywebsite.com/mywebservice

    【讨论】:

      【解决方案3】:

      在我看来,PHP 客户端出了点问题。他们不应该以任何方式解释服务的 URL。在服务器元数据或客户端配置中指定的任何 URL 都是它们应该使用的 URL。

      我不了解 PHP,但谁能告诉我为什么 PHP 关心 URL 中有多少个点有意义?我看不出我的服务是在http://localhost/foo/bar 还是“http://localhost/foo/b.a.r.asmx?PHP=0”对任何客户来说都很重要。

      【讨论】:

      • 问题不在于 PHP 关心有多少个点。那是 PHP 客户端不在我的控制之下,地址被硬编码为localhost/foo/bar,而 IIS 需要localhost/foo/bar.asmx。我需要 IIS 来理解没有 .asmx 的请求仍应得到处理。
      • 这开始证实我的信念,为什么网络服务或其他资源的任何客户端硬编码 URL 是个好主意???网址发生变化。他们应该从某个配置存储中获取 URL。
      【解决方案4】:

      在php中你只需要调用wsdl,你不需要asxm或.net做的那种愚蠢的事情。

      一个简单的例子

      $wsdl = "http://domain/wsdlfile.wsdl"; //url to wsdl 
      $client = new SoapClient($wsdl,array('trace' => 1,'encoding' => 'UTF-8','exceptions' => 0)); 
      $Return = $client->callfunction();
      echo htmlspecialchars($client->__getLastResponse());
      

      就是这样。

      【讨论】:

      • 对不起,但即使是 PHP 也不能调用 WSDL。 WSDL 仅描述 PHP 稍后将调用的服务。 WSDL 通常包含实际服务的 URL,这将是愚蠢的 .asmx 文件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-27
      • 1970-01-01
      • 2012-10-31
      • 1970-01-01
      • 2015-10-29
      • 1970-01-01
      相关资源
      最近更新 更多