Ошибка при попытке создать веб-службу json в asp.net

Я следовал этому, чтобы создать веб-службу json в asp.net 3.5:

Создание служб WCF с поддержкой JSON в .NET 3.5 (archive.org)

(Находился по адресу: http://www.pluralsight.com/community/blogs/fritz/archive/2008/01/31/50121.aspx)

Он отлично работает, если я хочу использовать его для внутреннего использования, но поскольку я хочу подключиться к нему извне, я получил сообщение об ошибке: «Публикация метаданных для этой службы в настоящее время отключена».

Поэтому я попытался включить его, но теперь получаю сообщение об ошибке: «Невозможно добавить расширение поведения serviceMetadata в поведение конечной точки MyServiceAspNetAjaxBehavior, поскольку базовый тип поведения не реализует интерфейс IEndpointBehavior».

Я знаю, что делаю что-то не так в web.config, просто не могу понять, что я делаю не так? Спасибо!

Это в web.config:

<system.serviceModel>
<behaviors>
  <endpointBehaviors>
    <behavior name="MyServiceAspNetAjaxBehavior">
      <enableWebScript />
      <serviceMetadata httpGetEnabled="true" />
    </behavior>
  </endpointBehaviors>
</behaviors>

//Needed to add this to be able to use the web service on my shared host
<serviceHostingEnvironment aspNetCompatibilityEnabled="true">
  <baseAddressPrefixFilters>
    <add prefix="http://www.domain.com"/>
  </baseAddressPrefixFilters>
</serviceHostingEnvironment>

<services>
  <service name="MyService">
    <endpoint address="" behaviorConfiguration="MyServiceAspNetAjaxBehavior" binding="webHttpBinding" contract="MyService" />
    <endpoint contract="MyService" binding="mexHttpBinding" address="mex" />

  </service>
</services>

In MyService.cs:

using System;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;

[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class MyService
{
    [OperationContract]

    public string GetForecast(string str)
    {
        return "Hello World";
    }
}

В MyService.svc

<%@ ServiceHost Language="C#" Debug="true" Service="MyService" CodeBehind="~/App_Code/MyService.cs" %>

person Community    schedule 19.09.2009    source источник


Ответы (1)


Ваша конечная точка MEX (та, которая предназначена для обмена метаданными) должна иметь определенный системный контракт IMetadataExchange (который вы ошиблись в своей конфигурации):

<services>
  <service name="MyService">
    <endpoint 
        address="" 
        behaviorConfiguration="MyServiceAspNetAjaxBehavior" 
        binding="webHttpBinding"   
        contract="MyService" />
    <endpoint 
        address="mex"
        binding="mexHttpBinding" 
        contract="IMetadataExchange"   />
  </service>
</services>

С этим контрактом вы должны иметь возможность видеть свои метаданные.

Тем не менее, предупреждение: службы RESTful обычно не предоставляют никаких метаданных, таких как WSDL или XSD - на самом деле это концепция SOAP.

Марк

person marc_s    schedule 19.09.2009
comment
Спасибо, я изменил на: ‹Контракт конечной точки=IMetadataExchange binding=mexHttpBinding address=mex /› Но все равно возникает та же ошибка, нужно ли мне что-то менять в моем файле веб-службы? - person ; 19.09.2009
comment
Я просто хочу, чтобы простой веб-сервис json вызывался с моего iphone, разве это невозможно с asp.net? есть что-то, что мне здесь не хватает? - person ; 19.09.2009
comment
Да, это возможно - у вас просто не может быть связанных с ним метаданных (службы REST не знают этой концепции) - person marc_s; 20.09.2009