В основном у меня есть старая веб-служба asmx на одном сервере, и у меня есть приложение потребления, которое имеет это как веб-ссылку и может видеть доступные методы. Также, если я перейду на URI веб-службы, я получаю стандартную страницу, в которой перечислены все их.
Я пытаюсь создать "потребительское" приложение, чтобы доказать, что это работает, поскольку просто нажатие "play" в режиме "отладки" недостаточно хорош, так как нам нужно предоставить примеры того, как его использовать.
Хотя он работает на 100%, когда я делаю это как отладочный прогон от VS 2010 на моем ПК и localhost: 5768 Я не могу заставить его работать с моим консольным приложением.
Это вызывает исключение, говоря, что ссылка на объект не существует, когда я пытаюсь получить нужную строку соединения из файла web.config.
Это работает, когда я запускаю его в режиме отладки, но НЕ, когда мое потребительское приложение попыталось запустить его, у которого есть веб-ссылка на нужный загрузочный URI службы.
Код в web.confifg - это просто
<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
}
}
Это простой проект потребительского приложения на С#, который я запускаю на своем ПК
Я добавил веб-ссылку в качестве правильной ссылки на консольное приложение, и я могу увидеть все веб-методы, которые она открыла, включая GetNames
Я получаю вызов веб-службы методом, который я хочу, например, GetNames, но затем он вызывает ошибки в методе SetUp, когда он пытается установить строку подключения для моего объекта SqlDatabase (мой класс данных).
Это все работает на 100% в DEMO, нажимая кнопку, работает на localhost и т.д.
Однако, когда я пытаюсь запустить тестовое консольное приложение на своем ПК, подключающемся к веб-сервису, я получаю следующую ошибку.
Начало 09/10/2012 22:05:23
Необработанное исключение: System.NullReferenceException: ссылка на объект не установлена в экземпляр объекта. в WebService.Service1.SetUp (метод String) в C:\Users\me\Documents\Visual Studio 2010\Projects\WebService\WebService\WebService.asmx.cs: строка 170 в WebService.Service1.GetNames(String ClientHash) в C :\Users\me\Documents\Visual Studio 2010\Projects\WebService\WebService\WebService.asmx.cs: строка 44 в TestWebService.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());
}
}
}
Поэтому я следую руководству (я взял на себя проект)> http://support2.microsoft.com/kb/308359
И, похоже, работает в том, что веб-служба найдена, метод может быть запущен, но вспомогательный метод в проекте терпит неудачу.
-Am Я должен переименовать web.config в другое приложение, например app.config? -Am Я должен жестко привязывать строки подключения или их можно обрабатывать - я не делаю ничего, что я раньше не делал в отношении получения настроек конфигурации? -Do Мне нужно добавить дополнительный код в мое потребительское приложение, чтобы позволить ИТ-серверу запускать SQL или получать параметры конфигурации?
Я не уверен, что я делаю неправильно, поскольку код кажется правильным. Плюс никто на работе не может мне помочь, но постоянно на спине просят, чтобы это было сделано!
ConfigurationManager.ConnectionStrings["APIDatabase"].ToString();
Поскольку вы говорите, что это строка, которая является ошибкой, можно только предположить, что "APIDatabase" не найден в вашем файле.config. Вызов .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>
EDIT: Просто заметили, что вы предоставили строку строки подключения web.config в своем вопросе. Убедитесь, что он находится под элементом configuration
.
Дважды проверьте, что сервер подает правильный файл web.config. Прошло некоторое время с тех пор, как я использовал IIS, но я помню, похоже, что в пользовательском интерфейсе было несколько различных версий web.config. Убедитесь, что вы добавили его в правильный.
Я должен переименовать web.config на что-то еще, например app.config?
Только если вы используете EXE для связи с веб-службой. EXE используют проект app.config
в проекте, а затем при MyExecutableName.exe.config
получают переименовать в MyExecutableName.exe.config
. Если вы используете приложение WinForm или Console, оно не будет читать ваш web.config и вместо этого будет искать.config, как я описал.
В настоящее время он работает и использует
ConfigurationManager.ConnectionStrings [ "APIDatabase"] ToString().
для получения строки подключения из кода webservice
Что я сделал
Я добавил WebServiceName.Program к объекту Startup моего тестового потребительского приложения.
Я всегда удалял веб-ссылку из потребительского приложения между перестройками WebService и копированием его на живой сайт. Я точно не знаю, почему теперь он может получить значение из файла конфигурации, а не жестко закодированную строку как прежде.
Я удалил это из своего файла 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, который мешал ему быть доступным?
Так или иначе работает сейчас!