Вызов JSON API из моего контроллера, а не из представления в моем веб-приложении asp.net mvc

Мне нужно вызвать JSON API для BPM-движка из моего веб-приложения asp.ner mvc. Вызов API для BPM построен следующим образом:

http://localhost:8080/jw/web/json/workflow/process/list?j_username=kermit&hash=9449B5ABCFA9AFDA36B801351ED3DF66&loginAs=' + username

где оба параметра j_user & hash представляют имя пользователя и пароль главного входа в систему, которые установлены на стороне механизма BPM. В настоящее время я вызываю API, используя java / script на уровне представления из моего asp.net mvc: -

$(document).ready(function () {
    var fullurl = 'http://localhost:8080/jw/web/json/workflow/package/list?j_username=kermit&hash=9449B5ABCFA9AFDA36B801351ED3DF66&loginAs=' + username ;
    $.ajax({
        type: "GET",
        url: fullurl, 

        dataType: "JSONP",
        // contentType: "application/json; charset=utf-8",
        success: function (result) {

            $.each(result.data, function (key, val) {

                // Format the text to display.
             //   var str = val.packageName + ' | ' + val.packageId;
                var str = val.packageName ;
                // Add a list item for the product.
                $('<li/>', { text: str })
                .appendTo($('#products'));

            });
        }
    });


});

Но мне сказали, что раскрытие как имени пользователя и пароля главного входа в систему, так и имени пользователя LoginAS, которое представляет имя пользователя для входа в систему на asp.net mvc, небезопасно, И ЧТО Я ДОЛЖЕН ВЫПОЛНИТЬ ВЫЗОВ API НА СТОРОНЕ СЕРВЕРА. ИЗГОТОВИТЬ API ВЫЗВАТЬ ИЗ JAVASCRIPT.

но мой вопрос, как я могу преобразовать мой код выше, чтобы получить JSON со стороны контроллера mvc, а затем передать JSON в представление? С уважением

 Esben Skov Pedersen11 окт. 2012 г., 11:04
Просто один на один с терминологией, так как я был смущен на короткое время. Представление обычно также отображается на сервере. В архитектуре MVC все M, V, C выполняются на сервере. «Выполнять вызов с сервера, а не с клиента» было бы более точным.

Ответы на вопрос(1)

Решение Вопроса

Вы могли бы использоватьWebClient запустить HTTP-запрос на указанный URL:

public class PackagesController: Controller
{
    public ActionResult List()
    {
        using (var client = new WebClient())
        {
            var query = HttpUtility.ParseQueryString(string.Empty);
            query["j_username"] = "kermit";
            query["hash"] = "9449B5ABCFA9AFDA36B801351ED3DF66";
            query["loginAs"] = "some_username";
            var url = new UriBuilder("http://localhost:8080/jw/web/json/workflow/package/list");
            url.Query = query.ToString();
            string json = client.DownloadString(url.ToString());
            return Content(json, "application/json");
        }
    }
}

или вы могли бы использовать новыйHttpClient введено в .NET 4.5:

public class PackagesController : AsyncController
{
    public async Task<ActionResult> ListPackages()
    {
        using (var client = new HttpClient())
        {
            var query = HttpUtility.ParseQueryString(string.Empty);
            query["j_username"] = "kermit";
            query["hash"] = "9449B5ABCFA9AFDA36B801351ED3DF66";
            query["loginAs"] = "some_username";
            var url = new UriBuilder("http://localhost:8080/jw/web/json/workflow/package/list");
            url.Query = query.ToString();
            var response = await client.GetAsync(url.ToString());
            var result = await response.Content.ReadAsStringAsync();
            return Content(result, "application/json");
        }
    }
}

и из вашего javascript отправьте запрос AJAX на вышеуказанное действие:

<script type="text/javascript">
    $(document).ready(function () {
        $.ajax({
            url: '@Url.Action("List", "Packages")', 
            type: 'GET',
            cache: false,
            success: function (result) {
                $.each(result.data, function (key, val) {
                    var str = val.packageName;
                    $('<li/>', { text: str })
                        .appendTo($('#products'));
                });
            }
        });
    });
</script>
 Darin Dimitrov11 окт. 2012 г., 11:28
В вашем теле есть тег_Layout, В качестве альтернативы вы можете добавитьdiv на вашей странице индекса.
 john Gu11 окт. 2012 г., 11:18
в отдельном файле JS
 john Gu11 окт. 2012 г., 11:18
Я думаю, что я должен вручную создать URL и передать его в сценарий ..
 john Gu11 окт. 2012 г., 11:17
спасибо за ответ, это частично работает. если я вручную перейти к следующему URLLOCALHOST: 1431 / Главная / ListPackages я получу Json, но я думаю, что проблема в том, что url: '@ Url.Action ("ListPackages", "Home") "внутри скрипта не работает, но я не знаю почему?
 Darin Dimitrov11 окт. 2012 г., 11:17
Этот сценарий в вашем представлении? Или это в отдельном файле JavaScript?

Ваш ответ на вопрос