编辑:我清理了一点,以便更清楚,我的问题是什么。对不起,它比它看起来要少。整个xml几乎把这篇文章搞砸了
我有一个在远程服务器上运行的Web服务 - 一个连接了某些硬件的Linux设备。通常由linux服务器控制的该硬件也可以通过使用wsdl通过Web服务连接。我从一名前员工那里得到了这个项目,现在完全挂起了,因为Web服务不能像我预期的那样工作。
据我所知,webservices的概念提供了一个界面,可以将其导入项目以访问Web服务,就好像它是本地库一样。
因此我在我的解决方案中添加了一个新库,添加了一个新的服务引用并将整个界面下载到我的项目中(Project explorer-> References-> Add service reference)。现在我有一个包含webservice(service.dll)的所有方法的DLL - 到目前为止,非常好。
我不明白:这个wizzard现在创建了一个app.config,因为我的理解已经过时了。 app.config包含:
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="ImageServerServiceSoapBinding" />
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://10.80.30.200:50000/xxxDataServer"
binding="basicHttpBinding" bindingConfiguration="ImageServerServiceSoapBinding"
contract="ServiceReference1.ImageServer" name="ImageServerPort" />
</client>
</system.serviceModel>
</configuration>
现在我在另一个项目(driver.dll)中使用此服务DLL,我在其中实现了对驱动程序中封装的服务的访问和取消。
using MyService.ServiceReference1
// ...
public class MyClient
{
public void Connect() {
this._Client = new ImageServerClient(
_Settings.EndPointConfigurationName,
@"http://" + _Settings.Physicals.IPAdress + ":" +
_Settings.Physicals.Port + _Settings.Physicals.SubDir);
}
上面代码中构建的地址指向: http://10.80.30.200:50000/xxxDataServer 这是与wsdl import wizzard中使用的目录相同的目录。
ImageServerClient是导入界面的一部分。它的定义是:
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
public partial class ImageServerClient : System.ServiceModel.ClientBase<MySerivce.ServiceReference1.ImageServer>, MySerivce.ServiceReference1.ImageServer {
public ImageServerClient(string endpointConfigurationName, string remoteAddress) :
base(endpointConfigurationName, remoteAddress) {
}
出于调试目的,我的解决方案中有另一个Project(test.exe)引用了driver.dll。
在这个test.exe中我调用了函数
Client = new MyClient(MySettings);
Client.Connect();
到目前为止一切顺利。在我的driver.dll中调用connect函数将调用service.dll以连接到远程客户端。
只要调用test.exe在app.config中保存以下信息,这将有效:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="ImageServerServiceSoapBinding" messageEncoding="Mtom" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="2147483647" maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None" realm=""/>
<message clientCredentialType="UserName" algorithmSuite="Default"/>
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://10.80.30.200:50000/xxxDataServer" binding="basicHttpBinding" bindingConfiguration="ImageServerServiceSoapBinding" contract="ServiceReference1.ImageServer" name="ImageServerPort"/>
</client>
</system.serviceModel>
然后调用LabView与app.config方案不兼容,因此driver.dll必须自动工作,而无需在driver.dll或service.dll之外进行任何额外配置。
删除app.config数据将在行中出现错误:
this._Client = new ImageServerClient(Settings.EndPointConfigurationName,
@"http://" + _Settings.Physicals.IPAdress + ":" +
_Settings.Physicals.Port + _Settings.Physicals.SubDir);
System.ServiceModel.dll中的InvalidOperationException 在ServiceModel-ClientConfiguration中找不到名称“...”和合同“...”的端点元素。这可能有以下原因:找不到此应用程序的配置文件,或者在客户端元素中找不到与名称匹配的EndPoint-Element。(翻译自德语)。
那么我认为这不起作用有什么不对?为什么还不够,所有的basicHttpBinding内容已经存在于service.dll(由wizzard创建)的app.config中?谢谢:))
答案 0 :(得分:1)
据我所知,您希望“driver.dll”成为Web服务客户端。
如果您打算使用app.config,则可以将其添加到您的exe中。 但我知道你想要以编程方式做所有事情。
所以,你的DLL应该实现连接,类似于这篇文章(你的客户端是WCF客户端吗?):
How to programmatically connect a client to a WCF service?
或者,如果是常规肥皂WS,您可能需要类似的东西: http://forums.asp.net/t/1473676.aspx?SOAP+HttpWebRequest+POST+to+web+service
http://www.roelvanlisdonk.nl/?p=1893
您的DLL的app.config将无法正常工作,因为app.config托管在托管应用程序中(例如EXE)