Объект не имеет ссылки на веб-сервис

1

В основном у меня есть старая веб-служба 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 или получать параметры конфигурации?

Я не уверен, что я делаю неправильно, поскольку код кажется правильным. Плюс никто на работе не может мне помочь, но постоянно на спине просят, чтобы это было сделано!

Теги:
web-services
visual-studio-2010
asmx

2 ответа

2
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, как я описал.

  • 0
    Я говорил о переименовании файла конфигурации в проектах WebService (который работает в демонстрационном режиме на локальном хосте). В приложении для потребителей вообще отсутствует файл web.config. Я просто пытаюсь запустить из него веб-метод, который, в свою очередь, обращается к строке подключения из файла web.config в приложении веб-службы. Строка соединения находится ПОД узлом конфигурации, сначала есть только некоторые узлы конфигурации с группами секций, которые ссылаются на system.web.extensions и т. Д. Также все части вашей строки соединения находятся в узле. NB это нормально работает в DEBUG (localhost) только через веб-сервис это ошибки
  • 0
    Что мне нужно, так или иначе, чтобы отладить это. Могу ли я перейти с консольного приложения потребителя на точку останова в моем веб-методе / веб-службе? Кажется странным, что он работает в режиме отладки, я могу добавить веб-сервис, посмотреть методы, но затем он выдает ошибки на простом узле get config IN в веб-сервисе.
Показать ещё 2 комментария
0

В настоящее время он работает и использует

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, который мешал ему быть доступным?

Так или иначе работает сейчас!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню