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/app1、test.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")]
再次打开IIS,关闭WCF服务,重新生成客户端的代理以使用新的命名空间-它再次正确地调用Increment方法。
更改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";
关闭IIS,启动WCF。
尝试从同一客户端调用Increment方法-出现异常:请求失败,HTTP状态为404:未找到。
如果我在步骤10中没有更改httpAddress,那么一切都很好,但在这种情况下,我只能在test.com域上托管一个服务。所以这个解决方案对我们来说是不够的。
终于找到了解决方案。
步骤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服务已经完成:)