#wcf #web-services #tfs
#wcf #веб-службы #tfs
Вопрос:
У меня есть веб-служба WCF, которую я разместил в IIS на своем компьютере. Это я добавил в качестве ссылки на службу в проекте Visual Studio, и я могу успешно вызвать его в веб-службе в этом проекте VS.
Сейчас я пытаюсь развернуть эти веб-службы на удаленном компьютере, на котором не установлена Visual Studio. Для этой цели я скопировал файлы .svc и web.config, а также папку bin этих веб-служб в папку на удаленном компьютере. Затем я разместил службы в IIS, указывающие на соответствующую папку. Теперь, когда я просматриваю веб-службу по ссылке .svc, я могу получить доступ к веб-службе со своего компьютера. Я добавил эту веб-службу в качестве ссылки на службу в моем проекте Visual Studio, и все выглядит нормально, я могу видеть отдельные методы и их параметры в обозревателе объектов. Проблема возникает, когда я пытаюсь вызвать методы из этих веб-служб. Я могу вызвать один метод, а затем, когда я вызываю второй, я получаю следующую ошибку (абсолютно тот же веб-сервис и все его методы работают отлично, если они размещены в IIS на моем ПК.):
Ссылка на объект не установлена для экземпляра объекта.
Вот часть метода, в котором я вызываю веб-службу (имя веб-службы — TFSWS).:
public void ImportRequirements(string username, string password)
{
TFSWS.TFSWSClient obj = new TFSWS.TFSWSClient();
string projects = obj.GetTFSProjects(username, password, TFS_URI);
string list = obj.GetAllWorkItems(ProjectName2, username, password, TFS_URI, WItypes);
Вот код первого метода, который я могу успешно вызвать из TFSWS:
public string GetTFSProjects(string userName, string password, string Uri)
{
StringWriter MyStringWriter = new StringWriter();
NetworkCredential cred = new NetworkCredential(userName, password);
TfsTeamProjectCollection _tfs = new TfsTeamProjectCollection(new Uri(Uri), cred);
_tfs.Authenticate();
ICommonStructureService tfsProjectService = (ICommonStructureService)_tfs.GetService(typeof(ICommonStructureService));
ProjectInfo[] projects = tfsProjectService.ListAllProjects();
string[] proj = new string[projects.Length];
for (int i = 0; i < projects.Length; i )
{
proj[i] = projects[i].ToString();
}
DataTable ProjectsDT = GetDataTableFromArray(proj);
...
}
Вот код второго метода, который я вызываю из TFSWS и который выдает сообщение об ошибке (при отладке я вижу, что все параметры назначены правильно):
public string GetAllWorkItems(string projectName, string username, string password, string URI, string[] WItypes)
{
StringWriter MyStringWriter = new StringWriter();
NetworkCredential cred = new NetworkCredential(username, password);
TfsTeamProjectCollection _tfs = new TfsTeamProjectCollection(new Uri(URI), cred);
_tfs.Authenticate();
WorkItemStore _witStore =(WorkItemStore)_tfs.GetService(typeof(WorkItemStore));
DataTable myData = new DataTable();
string project = projectName;
string[] m_columns;
Hashtable context = new Hashtable();
Project proj = _witStore.Projects[project];
}
string myQuery = "SELECT [System.Id], [System.Title], [System.WorkItemType], [System.State] FROM WorkItems WHERE ...";
WorkItemCollection result = _witStore.Query(myQuery, context);
DisplayFieldList fieldList = result.Query.DisplayFieldList;
...
}
Комментарии:
1. Возможно, вам захочется немного сократить код или провести рефакторинг некоторых методов. Довольно сложно отладить столько материала, просто прочитав его. С помощью рефакторинга вы также можете немного сузить проблемную область…
2. Получаемое вами исключение означает, что код пытается получить доступ к экземпляру объекта, который не был инициализирован или был установлен в null после первого вызова. Вы могли бы настроить службу WCF на удаленном КОМПЬЮТЕРЕ с помощью этого параметра , чтобы получить трассировку стека, которая может определить, где находится неинициализированный объект.
3. Я это уже сделал. К сожалению, трассировка стека не дает мне полезной информации.
Ответ №1:
Вы можете выполнять удаленную отладку, чтобы выяснить проблему, с которой сталкивается код на целевой машине, без установки на нее всей Visual Studio. Вам просто нужно развернуть сборки debug вместо сборок в режиме выпуска и запустить на них службу удаленного отладчика.
Комментарии:
1. Спасибо, Майк, это решило мою проблему. Я использовал удаленную отладку и смог определить, в чем проблема. Поскольку у меня не установлен Team Foundation Server на удаленном компьютере, где я размещаю свои веб-службы, отсутствовали некоторые сборки TFS, которые мне пришлось скопировать в папку bin моего веб-сервиса. Теперь все работает нормально. У меня возникли некоторые трудности с настройкой удаленного отладчика, и эти ссылки были особенно полезны для меня msdn.microsoft.com/en-us/library/9y5b4b4f.aspx и codeproject.com/KB/aspnet/IISRemoteDebugging.aspx .