我有一个我想要使用的https网络服务。
在C#中,我可以用大约10行代码实现这一点。
在Delphi XE5中,这是一个令人头痛的问题,并且存在大量的证书存储和加密。我需要能够在Delphi XE5中使用它。
我的想法是将(简单)调用粘贴到C#类库中的Web服务,然后使用CreateOleObject
通过Delphi实例化它。类库为regasm library.dll /codebase
和gacutil -i library.dll
我的问题似乎是当从C#使用Web服务时,它在很大程度上依赖于存储在app.config文件中的端点和绑定设置。问题是,是因为我使用Delphi和COM这个配置文件读取错误(我收到错误:Could not find endpoint element with name...
)。
我尝试了MyDelphiTestApp.exe.config
和library.dll.config
的各种排列,但它们似乎都无法读取(从类库项目中复制app.config
文件具有正确的其中的数据)。我在运行时调试了C#类库,看看它认为配置文件在哪里,然后确定那里有一个,但它仍然失败。
任何人都可以给我解决方案或推动正确的方向吗?
编辑:5月30日。 感谢你目前的帮助。我的代码目前代表:
var binding = new WSHttpBinding(SecurityMode.TransportWithMessageCredential);
binding.SendTimeout = new TimeSpan(0, 0, 0, 0, 100000);
binding.OpenTimeout = new TimeSpan(0, 0, 0, 0, 100000);
binding.MaxReceivedMessageSize = 10000;
binding.ReaderQuotas.MaxStringContentLength = 10000;
binding.ReaderQuotas.MaxDepth = 10000;
binding.ReaderQuotas.MaxArrayLength = 10000;
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
X509Certificate2Collection certs = store.Certificates.Find(X509FindType.FindByThumbprint, "XXXXXXXXXXXXXXXXXXXXXXXXXX", false);
store.Close();
if (certs.Count <= 0)
return "Could not find certificate";
AddressHeader addressHeader1 = AddressHeader.CreateAddressHeader("service1", "https://wibble.com/Service", 1);
AddressHeader[] addressHeaders = new AddressHeader[1] { addressHeader1 };
AddressHeaderCollection addressHeaderColl = new AddressHeaderCollection(addressHeaders);
var epIdentity = new X509CertificateEndpointIdentity(certs[0]);
EndpointAddress remoteAddress = new EndpointAddress(new Uri("https://wibble.com/Service/DataService.svc"), epIdentity, addressHeaderColl);
AiropsScheduleDataServiceClient client = new AiropsScheduleDataServiceClient(binding, remoteAddress);
var defaultCredentials = client.Endpoint.Behaviors.Find<ClientCredentials>();
client.Endpoint.Behaviors.Remove(defaultCredentials); //remove the default credentials
var loginCredentials = new ClientCredentials();
loginCredentials.UserName.UserName = Username;
loginCredentials.UserName.Password = Password;
client.Endpoint.Behaviors.Add(loginCredentials); //Add new credential to the proxy
ExportScheduleDataRequest request = new ExportScheduleDataRequest();
ExportScheduleDataResponse response = client.ExportScheduleData(request);
...但是这给了我一个Delphi客户端错误
&#34;由于与远程端点的安全协商失败,无法打开安全通道。这可能是由于在用于创建通道的EndpointAddress中缺少或错误指定了EndpointIdentity。请验证EndpointAddress指定或暗示的EndpointIdentity是否正确识别远程端点&#34;
我又迷路了。
答案 0 :(得分:1)
我不确定您使用XE5会遇到什么麻烦但是为了回答您的问题,您可以在C#代码中执行以下操作,通过代码进行绑定,而不是将它们放在app.config文件中:
var binding = new WSHttpBinding();
binding.SendTimeout = new TimeSpan(0, 0, 0, 0, 100000);
binding.OpenTimeout = new TimeSpan(0, 0, 0, 0, 100000);
binding.MaxReceivedMessageSize = 10000;
binding.ReaderQuotas.MaxStringContentLength = 10000;
binding.ReaderQuotas.MaxDepth = 10000;
binding.ReaderQuotas.MaxArrayLength = 10000;
// Set the security mode
binding.Security.Mode = SecurityMode.Transport;
var endpoint = new EndpointAddress("http://localhost:57102/MyService.svc");
var myClient = new WebServiceclient(binding, endpoint);
您可以根据需要更改值,并根据需要使用BasicHttpBinding或其他。
由于这些值在代码中,您可以直接从Delphi应用程序传递它们。