对象未设置为引用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或获取配置选项?
我不确定我做错了什么,因为代码似乎都是正确的。另外,工作中没有人能帮助我,而是一直在我背后要求完成!
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阻止了它的访问?
不管怎样,现在工作!