C#:WebService不能在外部.NET-DLL

时间:2015-11-09 13:42:46

标签: c# .net web-services dll

编辑:我清理了一点,以便更清楚,我的问题是什么。对不起,它比它看起来要少。整个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中?谢谢:))

1 个答案:

答案 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)

How to access app configuration from a .dll?

How to read app.config at dll level.?