Сбой TFS WebHook после публикации Webapi в IIS

Я использую TFS 2015 Webhook, чтобы получать уведомления, когда происходит регистрация. Я создал API с использованием.NET 4.6, чтобы я мог получать уведомления. Он отлично работает, когда я использую Visual Studio 2015 для загрузки API, но как только я опубликую его в IIS 7, TFS начинает показывать код состояния: 500, даже если код выполняется без каких-либо исключений.

Вот метод из веб-API. Я пишу вывод в журнал, чтобы убедиться, что он выполняется. Каждый раз пишет "возвращение успеха".

    public HttpResponseMessage Post([FromBody]Models.Content value)
    {
        try
        {
            IndexUpdater iUpdater = new IndexUpdater();
            iUpdater.UpdateIndex(value.resource.changesetId);

            using (StreamWriter w = File.AppendText("C:\\publish\\TFSListenerAPI\\log.txt"))
            {
                w.WriteLine("returning success");
            }
            return Request.CreateResponse(HttpStatusCode.OK);
        }
        catch(Exception ex)
        {
            using (StreamWriter w = File.AppendText("C:\\publish\\TFSListenerAPI\\log.txt"))
            {
                w.WriteLine("erro");
                w.WriteLine(ex.Message);
            }
        }
    }

Вот возвращенное сообщение

Вот результат, когда я выполняю API, используя Visual Studio, тот же код.

Изменить: только что обнаружил, что ошибка 500 происходит только при выполнении метода ниже. Странная часть заключается в том, что код работает, и содержимое возвращается с успехом.

    private string GetFileContent(string tfsPath)
    {
        TfsTeamProjectCollection server = new TfsTeamProjectCollection(new Uri("http://tfs2015.com.br:8080/tfs/cd-jv"), new System.Net.NetworkCredential("user", "password"));
        server.Authenticate();
        VersionControlServer version = server.GetService(typeof(VersionControlServer)) as VersionControlServer;
        Microsoft.TeamFoundation.VersionControl.Client.Item item = version.GetItem(tfsPath);
        string tempFileName = System.IO.Path.GetTempFileName();
        item.DownloadFile(tempFileName);
        var content = File.ReadAllText(tempFileName, Encoding.GetEncoding("ISO-8859-1"));
        return content;
    }

2 ответа

Решение

Итак, когда я редактирую пост после публикации, проблема заключается в этой строке:

TfsTeamProjectCollection server = new TfsTeamProjectCollection(new Uri("http://tfs2015.com.br:8080/tfs/cd-jv"), new System.Net.NetworkCredential("user", "password"));

По какой-то причине, если этот запрос сделан до того, как API вернет OK в Webhook, Webhook покажет ошибку 500. Поэтому я нашел способ заставить его работать, убедившись, что эта строка выполняется только после того, как tue API вернул OK. Это можно сделать с помощью Async/Await и Thread.Sleep().

Согласно сообщению об ошибке Status Code: 500 это должна быть внутренняя ошибка сервера, произошло что-то странное и необычное, что, вероятно, вовсе не ваша ошибка.

Попробуйте проверить средство просмотра событий, если есть другие журналы с кодами HResult, когда вы сталкиваетесь с ошибкой 500 в Internet Information Services (IIS) 7.0. Затем обратитесь к статье ниже для дальнейшего устранения неполадок: ошибка HTTP 500.0 - Внутренняя ошибка сервера "при открытии веб-страницы IIS 7.0

Также проверьте, помогает ли вам эта тема: Как получить пользовательский веб-крючок на веб-сайте IIS?

Другие вопросы по тегам