Вызов WebService из того же проекта - PullRequest
1 голос
/ 19 апреля 2010

Я пытаюсь вызвать веб-сервис asp.net из того же проекта, в котором он находится:

[MethodImpl(MethodImplOptions.Synchronized)]
public static void OnFileCreated(object source, FileSystemEventArgs e) {

    trackdata_analyse rWebAnalyse = new trackdata_analyse();
    rWebAnalyse.Analyse(@"pending\" + e.Name, "YOUNIVATE");

}

Однако я всегда получаю следующее « HttpContext недоступен. Этот класс может использоваться только в контексте запроса ASP.NET. » при вызове Server.MapPath из веб-службы:

[WebMethod]
public int Analyse(string fileName, string PARSING_MODULE){

    int nRecords;
    TrackSession rTrackSession = new TrackSession() ;
    string filePath = Server.MapPath(@"..\data\") + fileName;

Нужно ли вместо этого добавить веб-ссылку, хотя веб-служба находится в том же проекте?

Ответы [ 3 ]

1 голос
/ 19 апреля 2010

Вместо того, чтобы зависеть исключительно от HttpContext в вашем веб-сервисе (обычно это не очень хорошая практика), вы должны добавить параметризованный конструктор в ваш класс WebService. Затем в конструкторе по умолчанию без параметров вы можете проверить HttpContext на те же зависимости.

Таким образом, когда вам нужно вызвать веб-сервис из той же сборки, вы можете делиться зависимостями внутри процесса, а не полагаться на HttpContext.

В этом случае ваша зависимость - Server.MapPath, которая отображает относительный путь в URL-адресе на физический путь на жестком диске. Вместо этого вы можете настроить свой веб-сервис так, чтобы он принимал определенный путь или базовый путь, и, если он не указан, используйте Server.MapPath, чтобы найти его.

Или вы можете создать интерфейсную абстракцию, скажем IPathMapper, с одной реализацией, которая обертывает Server.MapPath, а другую - просто с физическим путем, и использовать вторую из той же сборки.

Я бы действительно рекомендовал это вместо добавления веб-ссылки из сборки вашего веб-сервиса; последнее значительно ухудшит производительность , не говоря уже об усложнении обслуживания приложения-службы.

0 голосов
/ 19 апреля 2010

Да, вы делаете, потому что запрос отправляется обратно в решение через веб-интерфейс.

0 голосов
/ 19 апреля 2010

Да, если вы хотите использовать HTTP-контекст, вызов должен поступить из Интернета (по предложенной вами веб-ссылке).

...