web服务从ASP.NET迁移到WCF后,从ASP.NET客户端调用WCF服务时出现HTTP状态404错误

本文关键字:WCF NET ASP 服务 HTTP 错误 状态 迁移 web 客户端 调用 | 更新日期: 2023-09-27 18:29:47

目前,我们有许多客户使用ASP.NET客户端来调用我们的各种ASP.NET Web服务。我们希望在不接触客户的客户端及其代理的情况下将web服务迁移到WCF。此外,我们希望避免将IIS用于托管服务。

我准备了一个简单的原型来检查我们是否能够实现这样的迁移。如果只使用web服务的简单命名空间,例如test.com,则此原型可以正常工作。但是,由于我们的ASP.NET服务具有test.com/app1test.com/app2等命名空间,因此我们需要相应地构建WCF服务。不幸的是,当使用这样的地址时,我在调用服务的方法时得到HTTP状态404错误。

经过几天的挣扎,我不确定如果没有IIS上的托管服务,这样的迁移是否可能(IIS解决方案是http://msdn.microsoft.com/en-us/library/aa738697(v=vs.100).aspx).

请按照我所做的步骤准备工作原型(使用名称空间test.com),并告诉我扩展名称空间的错误之处(如test.com/app。)。

1。初始ASP.NET web服务:

[WebService(Namespace = "http://test.com")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class AspNetWebService : WebService
{
  private static int _counter = 0;
  [WebMethod]
  public int Increment()
  {
    return _counter++;
  }
}

2。在IIS 7.0上部署web服务。

3。通过将Visual Studio 2012中的web引用添加到web服务的asmx文件,创建简单的ASP.NET客户端并生成web服务的代理(从步骤1开始)。

4。客户端正确地调用Increment方法,所以我不会更改此客户端以检查是否可以调用WCF服务。

5。创建WCF服务。

合同:

[ServiceContract(Name = "IncrementService", Namespace = "http://test.com")]
public interface IIncrementService
{
  [OperationContract(Action = "http://test.com/Increment")]
  int Increment();
}

服务:

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]
public class IncrementService : IIncrementService
{
  private static int _counter = 0;
  public int Increment()
  {
    return _counter++;
  }
}

自托管在:

static void Main(string[] args)
{
     const string httpAddress = "http://test.com";
     var host = new ServiceHost(typeof(IncrementService), new Uri(httpAddress));
     try
     {
       var metadataBehavior = host.Description.Behaviors.Find<ServiceMetadataBehavior>();
       if (metadataBehavior == null)
         metadataBehavior = new ServiceMetadataBehavior();
       metadataBehavior.HttpGetEnabled = true;
       host.Description.Behaviors.Add(metadataBehavior);
       var httpBinding = new BasicHttpBinding();
       httpBinding.Security.Mode = BasicHttpSecurityMode.None;
       httpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
       host.AddServiceEndpoint(typeof(IIncrementService), httpBinding, httpAddress);
       host.Open();
       Console.ReadLine();
       host.Close();
     }
     catch (Exception ex)
     {
       Console.WriteLine("An exception occurred: {0}", ex.Message);
       host.Abort();
     }
}

6。关闭IIS以确保ASP.NET web服务不工作,然后启动WCF服务。

7。运行与以前相同的客户端(没有任何更改或代理重新生成)-它正确地调用Increment。

到目前为止还不错。。。现在我扩展命名空间。

8。将应用程序名称添加到ASP.NET web服务中的命名空间,如下所示:

[WebService(Namespace = "http://test.com/app")]
  1. 再次打开IIS,关闭WCF服务,重新生成客户端的代理以使用新的命名空间-它再次正确地调用Increment方法。

  2. 更改WCF服务中的命名空间如下:

合同:

[ServiceContract(Name = "IncrementService", Namespace = "http://test.com/app")]
public interface IIncrementService
{
  [OperationContract(Action = "http://test.com/app/Increment")]
  int Increment();
}

在主机应用程序中更改httpAddress:

const string httpAddress = "http://test.com/app";
  1. 关闭IIS,启动WCF。

  2. 尝试从同一客户端调用Increment方法-出现异常:请求失败,HTTP状态为404:未找到。

如果我在步骤10中没有更改httpAddress,那么一切都很好,但在这种情况下,我只能在test.com域上托管一个服务。所以这个解决方案对我们来说是不够的。

web服务从ASP.NET迁移到WCF后,从ASP.NET客户端调用WCF服务时出现HTTP状态404错误

终于找到了解决方案。

步骤10中的httpAddress应设置为与步骤3中生成的从ASP.NET客户端获取的ASP.NET Web服务的URL相同。
在我的例子中,Web服务的URL是(你可以在客户端的app.config中找到它):

http://192.168.1.2/WS_simple/AspNetWebService.asmx

其中WS_simple是IIS中托管的ASP.NET应用程序名称(在步骤2中创建)

所以我将httpAddress更改为:

http://localhost/WS_simple/AspNetWebService.asmx

也许这不是WCF服务的好地址,但它是有效的。因此,迁移到没有向后兼容IIS的WCF服务已经完成:)