.NET ASMX - Возврат чистого JSON?

Я схожу с ума здесь. Я посмотрел на следующие записи, и ни один из них не исправляет аномальное поведение, которое я вижу:

Я также посмотрел на и подтвердил свою установку: http://www.asp.net/AJAX/documentation/live/ConfiguringASPNETAJAX.aspx

Вот мой код (код ASMX позади):

namespace RivWorks.Web.Services
{
    /// 
    /// Summary description for Negotiate
    /// 
    [WebService(Namespace = "http://rivworks.com/webservices/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    [ScriptService]
    public class Negotiate : System.Web.Services.WebService
    {
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public RivWorks.Data.Objects.rivProduct GetSetup(string jsonInput)
        {
            // Deserialize the input and get all the data we need...
            // TODO:  This is a quick hack just to work with this for now...
            char[] tokens = { '(', '{', '}', ')', ',', '"' };
            string[] inputs = jsonInput.Split(tokens);
            string inputRef = "";
            string inputDate = "";
            string inputProductID = "";
            for (int i = 0; i < inputs.Length; i++)
            {
                if (inputs[i].Equals("ref", StringComparison.CurrentCultureIgnoreCase))
                    inputRef = inputs[i+2];
                if (inputs[i].Equals("dt", StringComparison.CurrentCultureIgnoreCase))
                    inputDate = inputs[i+2];
                if (inputs[i].Equals("productid", StringComparison.CurrentCultureIgnoreCase))
                    inputProductID = inputs[i+2];
            }

            Guid pid = new Guid(inputProductID);
            RivWorks.Data.Objects.rivProduct product = RivWorks.Data.rivProducts.GetProductById(pid);

            return product;
        }
    }

Когда я выполняю это от своего localhost экземпляра, я получаю этот набор результатов:

  
    modal
    775
    600
    
    http://localhost.rivworks.com/flash/negotiationPlayer.swf
    
    
    http://cdn1.rivworks.com/Element/Misc/734972de-40ae-45f3-9610-5331ddd6e8f8/apple-logo-2.jpg
    
  

Что я пропускаю???


Примечание: Я использую 3,5 платформы (или по крайней мере я думал, что был, поскольку все в моем web.config отмечено для 3.5.0.0),


ОБНОВЛЕНИЕ: Я просматриваю к сервису и использую поле ввода на той странице. Можно попробовать здесь: http://dev.rivworks.com/services/Negotiate.asmx?op=GetSetup. Мы также пытаемся получить доступ к нему из базирующегося веб-приложения JS, работающего на другом сайте (основная цель этого конкретного сервиса). У меня нет кода для этого здесь. (Извините, тестовая форма только доступна от localhost.)


ОБНОВЛЕНИЕ: Я добавил следующую тестовую страницу (JsonTest.htm), чтобы попытаться видеть то, что шло назад и вперед. Все, что я получаю, является 500 ошибками! Я даже пытался присоединить к процессу, и ворвитесь в мой сервис. 500 ошибок брошены, прежде чем конвейер ASP когда-либо входит в мой код.




    Untitled Page
    

    


    
Bleh
Test it

Почему это настолько крайне трудно?!?!:)


ОБНОВЛЕНИЕ: Работа через сервис WCF. Вот моя установка: Интерфейс:

namespace RivWorks.Web.Services
{
    [ServiceContract(Name = "Negotiater", Namespace = "http://www.rivworks.com/services")]
    public interface INegotiaterJSON
    {
        //[WebMethod]
        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        [ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Json)]
        ResultSet GetSetup(string jsonInput);
    }
}

Класс:

namespace RivWorks.Web.Services
{
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
    public class Negotiater : INegotiaterJSON
    {
        public ResultSet GetSetup(string jsonInput)
        {
            //code removed for brevity - see ASMX code above if you are really interested.
            return resultSet;
        }
    }


    [DataContract()]
    public class ResultSet
    {
        [DataMember]
        public string uiType = "modal";
        [DataMember]
        public int width = 775;
        [DataMember]
        public int height = 600;
        [DataMember]
        public string swfSource = "";
        [DataMember]
        public string buttonConfig = "";
    }
}

web.config

  
    
      
        
          
        
      
      
        
          
        
      
    
    
      
        
          
        
        
          
        
      
      
        
          
          
        
      
    
    
      
        
      
    
    
      
        
      
    
  

простая тестовая страница




    Untitled Page
    

    



    
Bleh
Test it

И теперь я получаю эту ошибку: IIS указал схемы аутентификации 'IntegratedWindowsAuthentication, Anonymous, но обязательное только поддерживает спецификацию точно одной схемы аутентификации. Действительные схемы аутентификации являются Обзором, Согласовывают, NTLM, Основной, или Анонимный. Измените настройки IIS так, чтобы только единственная схема аутентификации использовалась.

Как я обрабатываю это? <указывают эмоцию ='wrung' физический ='beat'/>

5
задан Community 23 May 2017 в 12:19
поделиться

2 ответа

Почему бы вам не перенести свой веб-сервис ASMX в WCF?

API WCF в .NET Framework 3.5 изначально поддерживает веб-сервисы JSON.

Кроме того, Microsoft объявила ASMX как «устаревший» технология "и предлагает" Веб-службы и клиенты веб-служб XML теперь должны создаваться с помощью Windows Communication Foundation (WCF) ". ( Источник ).

Вы можете просмотреть эти ссылки, чтобы начать работу:

Кроме того, вы также можете прочитать следующий пример, который я «извлек» из самообслуживания. размещал мой проект WCF. Самостоятельные службы WCF не требуют IIS, но может обслуживаться из любого управляемого приложения .NET. Этот пример размещен в очень простом Консольном приложении C # :

IContract.cs

using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;

namespace MyFirstWCF
{
    [ServiceContract] 
    public interface IContract
    {
        [OperationContract]
        [WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "/CustomerName/{CustomerID}")]
        string GET_CustomerName(string CustomerID);
    }
}

Service.cs

using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Syndication;
using System.ServiceModel.Web;

namespace MyFirstWCF
{
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.NotAllowed)]
    public class Service : IContract
    {
        public string GET_CustomerName(string CustomerID)
        {
            return "Customer Name: " + CustomerID;
        }
    }
}

WCFHost.cs (Консольное приложение)

using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.ServiceModel.Description;
using System.Threading;
using System.Text;

namespace MyFirstWCF
{
    class Program
    {
        private static WebServiceHost M_HostWeb = null;

        static void Main(string[] args)
        {
            M_HostWeb = new WebServiceHost(typeof(MyFirstWCF.Service));

            M_HostWeb.Open();

            Console.WriteLine("HOST OPEN");
            Console.ReadKey();

            M_HostWeb.Close();
        }
    }
}

app.config

<?xml version="1.0" encoding="utf-8" ?>

<configuration>
  <system.serviceModel>
    <services>
      <service name="MyFirstWCF.Service">

        <endpoint address="http://127.0.0.1:8000/api"
                  binding="webHttpBinding"
                  contract="MyFirstWCF.IContract" />

      </service>
    </services>

  </system.serviceModel>
</configuration>

Приведенный выше пример очень прост. Если вы создаете запрос с Fiddler на http://127.0.0.1:8000/api/CustomerName/1000 , он просто вернет «Имя клиента: 1000» .

Не забудьте установить content-type: application / json в заголовке запроса. Чтобы вернуть более сложные структуры данных, вам придется использовать Контракты данных. Они построены следующим образом:

[DataContract]
public class POSITION
{
    [DataMember]
    public int      AssetID { get; set; }

    [DataMember]
    public decimal  Latitude { get; set; }

    [DataMember]
    public decimal  Longitude { get; set; }
}

Вам необходимо добавить ссылки .NET на System.RuntimeSerialization , System.ServiceModel и System.ServiceModel.

8
ответ дан 13 December 2019 в 19:28
поделиться

What's the "Content-Type" set to on the request to the method?

From what I've done with the ASP.NET, if it's set to text/xml, you'll get back XML; but if it's set to application/json, you'll get JSON back.

3
ответ дан 13 December 2019 в 19:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: