我写了一个相当简单的小C#web服务,通过WCF从独立的EXE托管。代码 - 有点简化 - 看起来像这样:如何从Delphi 2007中使用非IIS托管的WCF C#Web服务?
namespace VMProvisionEXE
{
class EXEWrapper
{
static void Main(string[] args)
{
WSHttpBinding myBinding = new WSHttpBinding();
myBinding.Security.Mode = SecurityMode.None;
Uri baseAddress = new Uri("http://bernard3:8000/VMWareProvisioning/Service");
ServiceHost selfHost = new ServiceHost(typeof(VMPService), baseAddress);
try
{
selfHost.AddServiceEndpoint(typeof(IVMProvisionCore), myBinding, "CoreServices");
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy12;
selfHost.Description.Behaviors.Add(smb);
// Add MEX endpoint
selfHost.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
selfHost.Open();
Console.WriteLine("The service is ready.");
Console.ReadLine();
其余的C#代码;上面的类VMPService实现了VMProvisionCore.IVMProvisionCore。
我可以很容易地创建一个使用此服务的Visual Studio 2008客户端应用程序。没问题。但是使用Delphi 2007是一个不同的问题。我可以使用Delphi中的WSDL导入器从(在这种情况下)检索WSDL http://bernard3:8000/VMWareProvisioning/Service?wsdl导入单元编译得很好。我必须手工初始化代理由于WSDL不包含一个URL(注意额外“/ CoreServices”如图所示的C#代码):
var
Auth: AuthenticateUser;
AuthResponse: AuthenticateUserResponse;
CoreI: IVMProvisionCore;
begin
CoreI:= GetIVMProvisionCore(False, 'http://bernard3:8000/VMWareProvisioning/Service/CoreServices');
Auth:= AuthenticateUser.Create;
try
Auth.username:= 'test';
Auth.password:= 'test';
AuthResponse:= CoreI.AuthenticateUser(Auth);
finally
FreeAndNIL(Auth);
end;
上面的代码,当它击中就会产生错误“CoreI.AuthenticateUser(Auth);”。错误是“无法处理该消息,因为该内容类型‘文本/ XML;字符集=‘UTF-8’不是预期的类型’应用/肥皂+ xml的;字符集= UTF-8”
我怀疑我在某个地方出现了一个愚蠢的小错误,可能是在导入WSDL或连接选项时出现错误。谁能帮忙?
你知道我可以在哪里下载最新的WSDLImp.exe吗?我检查了Embarcadero网站,但找不到任何超出它的错误修复引用。 – 2009-07-21 14:46:42