对象未设置为使用Web服务引用

时间:2014-10-09 21:32:00

标签: c# .net visual-studio-2010 web-services asmx

基本上我在一台服务器上有一个旧的asmx Web服务,我有一个消费应用程序,它将此作为Web引用,可以看到可用的方法。此外,如果我转到Web服务URI,我会得到标准页面,列出它们全部。

我正在努力创建一个"消费者"应用程序,以证明它只是按下"播放" in" debug"模式不够好,因为我们需要向客户提供如何使用它的示例。

虽然当我在我的PC和本地主机上使用VS 2010进行调试时它100%有效,但我无法通过我的消费者控制台应用程序使用它。

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

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

web.confifg中的代码只是

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

我的.asmx文件中带有webmethod的代码调用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#中的简单消费者应用程序项目

我已将网络参考添加为对控制台应用的正确引用,我可以看到它已公开的所有网络方法,包括GetNames

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

这一切都在DEMO中正常运行,按下播放,在localhost等上运行。

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

Start 09/10/2014 22:05:23

未处理的异常:System.NullReferenceException:未将对象引用设置为对象的实例。    在C:\ Users \ me \ Documents \ Visual Studio 2010 \ Projects \ WebService \ WebService \ WebService.asmx.cs中的WebService.Service1.SetUp(String方法):第170行    在C:\ Users \ me \ Documents \ Visual Studio 2010 \ Projects \ WebService \ WebService \ WebService.asmx.cs中的WebService.Service1.GetNames(String ClientHash):第44行    在TestManService.Program.Main(String [] args)中的C:\ Users \ rreid \ Documents \ Visual Studio 2010 \ Projects \ WebService \ TestWebService \ Program.cs:第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());

        } 
     }
}

所以我遵循指南(我已经接管了该项目)&gt; http://support2.microsoft.com/kb/308359

似乎工作在找到Web服务,该方法可以运行,但项目中的子方法失败。

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

我不确定我做错了什么,因为代码似乎都是正确的。加上工作中没有人可以帮助我,但我总是在背上要求它完成!

2 个答案:

答案 0 :(得分:2)

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连接字符串条目。确保它位于configuration元素下。

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

  

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

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

答案 1 :(得分:0)

现在正在使用

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阻止了它的访问?

无论如何现在都有效!