对象未设置为引用web服务

本文关键字:web 服务 引用 设置 对象 | 更新日期: 2023-09-27 18:26:08

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

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

尽管当我在我的PC和localhost:5768上从VS 2010进行调试时,它可以100%工作,但我无法从我的消费者控制台应用程序中使它工作。

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

当我在调试模式下运行它时,这是有效的,但当我的消费者应用程序试图运行它时(它加载了对正确服务URI的web引用),这是无效的。

web.conffg中的代码只是

<connectionStrings>
    <add name="APIDatabase" connectionString="SERVER=MYSERVER;DATABASE=MYDB;uid=MYUID;pwd=MYPWD;" providerName="System.Data.SqlClient" />   
</connectionStrings>

我的.asmx文件中的Web方法调用SetUp,试图获得这个值,代码如下(去掉了绒毛)

using System;
using System.Collections.Generic;
using System.Collections;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Services;
namespace WebService
{
    [WebService(Namespace = "http://webservice.demo.net/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    public class Service1 : System.Web.Services.WebService
    {
        // my DB object that runs all my DB queries, opens & kills connections etc
        private SqlDatabase SqlDatabase;
        [WebMethod]
        public string GetNames(string ClientHash)
        {
            // gets here then calls the SetUp method passing in "GetNames"
            // call SetUp to set up global objects - call on every web method
            this.SetUp("GetNames");  
            //.. more code
    }
    private void SetUp(string method)
    {
        // create DB object
        this.SqlDatabase = new SqlDatabase();
        // **it is erroring here** - Using System.Configuration is added at top of class and there is a manual reference added to the DLL
        **this.SqlDatabase.ConnectionString = ConfigurationManager.ConnectionStrings["APIDatabase"].ToString();**
        // more code it cannot get to due to the above error
    }  
}

这是我在PC 上运行的C#中的简单消费者应用程序项目

我添加了web引用作为控制台应用程序的适当引用,我可以看到它公开的所有web方法,包括GetNames

我访问了web服务,调用了我想要的方法,例如GetNames,但它在SetUp方法上出错,因为它试图为我的SqlDatabase对象(我的数据类)设置连接字符串。

这一切都在DEMO中100%工作,按下播放,在本地主机上运行等。

然而,当我尝试在连接到Web服务的PC上运行测试控制台应用程序时,我会出现以下错误。

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

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

我的消费者应用程序中的代码如下。

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());
        } 
     }
}

所以我正在遵循一个指南(我已经接管了这个项目)>http://support2.microsoft.com/kb/308359

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

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

我不确定我做错了什么,因为代码似乎都是正确的。另外,工作中没有人能帮助我,而是一直在我背后要求完成!

对象未设置为引用web服务

ConfigurationManager.ConnectionStrings["APIDatabase"].ToString();

由于您说这是有错误的一行,因此只能假设在.config文件中没有找到"APIDatabase"。对null对象调用.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连接字符串条目。确保它位于configuration元素下方。

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

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

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

它现在正在工作并使用

ConfigurationManager.ConnectionStrings["APIDatabase"].ToString();

从Web服务代码中获取连接字符串

我做的事情

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

在重建WebService和将其复制到实时网站之间,我总是从消费者应用程序中删除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阻止了它的访问?

不管怎样,现在工作!