Я схожу с ума здесь. Я посмотрел на следующие записи, и ни один из них не исправляет аномальное поведение, которое я вижу:
Я также посмотрел на и подтвердил свою установку: 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'/>
Почему бы вам не перенести свой веб-сервис 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.
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.