C# 对象未设置为使用web服务引用

C# 对象未设置为使用web服务引用,c#,.net,visual-studio-2010,web-services,asmx,C#,.net,Visual Studio 2010,Web Services,Asmx,基本上,我在一台服务器上有一个旧的asmx web服务,我有一个消费应用程序,它将此作为web参考,并可以查看可用的方法。另外,如果我转到web服务URI,我会得到一个标准页面,其中列出了所有这些URI 我试图创建一个“消费者”应用程序来证明它的工作原理,因为在“调试”模式下仅仅按“播放”是不够的,因为我们需要给客户提供如何使用它的示例 虽然当我在我的PC和localhost:5768上从VS 2010进行调试运行时,它100%工作,但我无法从我的消费者控制台应用程序让它工作 当我试图从web.

基本上,我在一台服务器上有一个旧的asmx web服务,我有一个消费应用程序,它将此作为web参考,并可以查看可用的方法。另外,如果我转到web服务URI,我会得到一个标准页面,其中列出了所有这些URI

我试图创建一个“消费者”应用程序来证明它的工作原理,因为在“调试”模式下仅仅按“播放”是不够的,因为我们需要给客户提供如何使用它的示例

虽然当我在我的PC和localhost:5768上从VS 2010进行调试运行时,它100%工作,但我无法从我的消费者控制台应用程序让它工作

当我试图从web.config文件获取所需的连接字符串时,它引发了一个异常,即对象引用不存在

这在我以调试模式运行它时有效,但在我的消费者应用程序尝试运行它时无效,因为它加载了对正确服务URI的web引用

web.configf中的代码只是

<connectionStrings>
    <add name="APIDatabase" connectionString="SERVER=MYSERVER;DATABASE=MYDB;uid=MYUID;pwd=MYPWD;" providerName="System.Data.SqlClient" />   
</connectionStrings>
这是我在PC上运行的C#中的简单消费者应用程序项目

我已经添加了web引用作为对console应用程序的正确引用,并且我可以看到它公开的所有web方法,包括GetNames

我使用我想要的方法调用web服务,例如GetNames,但是当它试图为我的SqlDatabase对象(我的数据类)设置连接字符串时,SetUp方法会出错

这一切在演示、按play、在本地主机上运行等方面都能100%正常工作

但是,当我尝试在连接到Web服务的PC上运行测试控制台应用程序时,我遇到以下错误

开始于2014年10月9日22:05:23

未处理的异常:System.NullReferenceException:对象引用未设置为对象的实例。 在C:\Users\me\Documents\visualstudio 2010\Projects\WebService\WebService\WebService.asmx.cs中的WebService.Service1.SetUp(字符串方法)中:第170行 在C:\Users\me\Documents\Visual Studio 2010\Projects\WebService\WebService\WebService\WebService.asmx.cs中的WebService.Service1.GetNames(字符串ClientHash)处:第44行 在C:\Users\rreid\Documents\Visual Studio 2010\Projects\WebService\TestWebService\Program.cs中的TestWebService.Program.Main(字符串[]args)处:第21行

下面是我的消费者应用程序中的代码

using System;
using System.Collections;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Services;

namespace TestWebService
{
    public class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Start " + DateTime.Now.ToString());

            // Create my web service object
            MyWebService.Service1 MyWebService = new MyWebService.Service1();

            string customerID = "6D104928-7633-4998-90C5-C01ABD4E010B"; // test a customer I know works

            // this is line 21 in my code (see ethe rror message above)
            // It errors in the SetUp method in the asmx file in the SetUp method when trying to get a connection string from the app.config file and set it to the database object I use
            string response = MyWebService.GetNames(customerID);

            Console.WriteLine("Stop " + DateTime.Now.ToString());

        } 
     }
}
因此,我遵循一个指南(我已经接管了该项目)>

它的工作原理似乎是找到了web服务,该方法可以运行,但项目中的一个子方法失败了

-我是否应该将web.config重命名为其他名称,例如app.config? -我应该硬编码连接字符串还是可以处理它们-我没有做任何我以前没有做过的关于获取配置设置的事情? -我是否需要向我的消费者应用程序中添加额外的代码以允许它运行SQL或获取配置选项

我不确定我做错了什么,因为代码似乎都是正确的。此外,工作中没有人能帮助我,但他们总是背着我要求我去做

ConfigurationManager.ConnectionStrings["APIDatabase"].ToString();
由于您说这是出错的行,因此只能假设在您的.config文件中未找到“APIDatabase”。对空对象调用
.ToString()
将导致该错误。如果您能够编辑和测试代码,那么应该将其拆分并检查是否能够获得连接字符串

ConnectionStringSettings csItem = ConfigurationManager.ConnectionStrings["APIDatabase"];
if (csItem == null)
    throw new Exception("Connection string not found for \"APIDatabase\"");

SqlDatabase.ConnectionString = csItem.ConnectionString;
web.config应设置一个连接字符串条目,如下所示:

<configuration>
    <connectionStrings>
       <add name="APIDatabase" 
            providerName="YOUR PROVIDER" 
            connectionString="YOUR CONNECTION STRING" />
    </connectionStrings>
</configuration>

编辑:刚刚注意到您在问题中提供了web.config连接字符串条目。确保它位于
配置
元素下

仔细检查服务器是否提供了正确的web.config文件。我已经有一段时间没有使用IIS了,但我记得UI中似乎有几个不同版本的web.config。确保已将其添加到正确的

我是否应该将web.config重命名为其他名称,例如app.config


仅当您使用EXE与web服务通信时。exe在项目中使用
app.config
,然后在构建时重命名为
MyExecutableName.exe.config
。如果您使用的是WinForm或Console应用程序,那么它将不会读取您的web.config,而是查找我所描述的.config。

它现在正在工作并使用

ConfigurationManager.ConnectionString[“APIDatabase”].ToString()

从webservice代码获取连接字符串

我做的事

我将WebServiceName.Program添加到我的测试消费者应用程序的启动对象中

在重新构建web服务和将其复制到live站点之间,我总是从消费者应用程序中删除web引用。我不知道为什么它现在能够从配置文件中获取值,而不是像以前那样从硬编码字符串中获取值

我从我的web.config文件中删除了它,该文件位于它的顶部,似乎没有它也可以工作

<configSections>
      <sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
        <sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">          
          <sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
          </sectionGroup>
        </sectionGroup>
      </sectionGroup>
    </configSections>  

所以可能是XML阻止了它的访问


反正现在可以了

我说的是在WebService项目中重命名配置文件(在本地主机上以演示模式工作)。消费者应用程序中根本没有web.config文件,我只是尝试从中运行一个webmethod,而该webmethod又从web服务应用程序中的web.config文件访问连接字符串。连接字符串位于配置节点下,首先只有一些configsection节点和引用system.web.extensions等的SectionGroup。此外,连接字符串的所有部分都在该节点中。注意,它在调试(localhost)中运行良好,只有通过webservice it Errors,我需要的是某种方式来调试它。我可以从消费者控制台应用程序跳转到web方法/web服务中的断点吗?它在调试模式下工作似乎很奇怪,我可以添加webservice,查看方法,但是它在webservice中的一个简单的get config节点上出错
<configSections>
      <sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
        <sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">          
          <sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
          </sectionGroup>
        </sectionGroup>
      </sectionGroup>
    </configSections>