2010-04-19 3 views
1

Я пытаюсь вызвать asp.net веб-сервиса из того же проекта в следующих областях:Вызов WebService из того же проекта

[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 из WebService:.

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

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

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

ответ

1

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

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

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

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

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

+0

Или я могу использовать HttpRuntime.AppDomainAppPath, хорошо играть, чтобы получить базовый каталог –

0

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

0

Да, так как запрос выходит и возвращается в решение через веб-интерфейс.

 Смежные вопросы

  • Нет связанных вопросов^_^