发出 JSON 的 WCF Web 服务(Noob 建议)

Posted

技术标签:

【中文标题】发出 JSON 的 WCF Web 服务(Noob 建议)【英文标题】:WCF Web Service that emits JSON (Noob advice) 【发布时间】:2011-12-12 12:55:32 【问题描述】:

我非常了解 C#、XAML、Visual Studio 等领域,我需要一些帮助来了解如何创建一个简单的发出 JSON 的 WCF Web 应用程序,我还想知道如何测试该应用程序的输出也是如此。

我一直在四处寻找并关注了几个不同的blogs,但到目前为止都没有运气。我在这里找到了另一个post,但我的尝试再次失败了哈哈

我想我现在已经到了让自己完全困惑的地步,因为我看了太多不同的例子,需要这个伟大网站的帮助:)

我会尽力为您提供尽可能多的代码,希望我已经完成了一些可以获救的事情!

非常感谢您的帮助!!

Person.cs

namespace TestService

[DataContract]
public class Person

    [DataMember]
    public string FirstName  get; set; 

    [DataMember]
    public string LastName  get; set; 

    [DataMember]
    public int Age  get; set; 

    public Person(string firstName, string lastName, int age)
    
        this.FirstName = firstName;
        this.LastName = lastName;
        this.Age = age;
    

MyTestService.svc.cs

    namespace TestService

    [ServiceContract(Namespace = "")]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class TestService
    
        [OperationContract]
        [WebGet(ResponseFormat = WebMessageFormat.Json)]
        public string GetResults()
        
            List<Person> results = new List<Person>();
            results.Add(new Person("Peyton", "Manning", 35));
            results.Add(new Person("Drew", "Brees", 31));
            results.Add(new Person("Tony", "Romo", 29));

            // Serialize the results as JSON
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(results.GetType());
            MemoryStream memoryStream = new MemoryStream();
            serializer.WriteObject(memoryStream, results);

            // Return the results serialized as JSON
            string json = Encoding.Default.GetString(memoryStream.ToArray());
            return json;
        
    

MyTestService.svc

<%@ ServiceHost Language="C#"
Service="TestService.MyTestService"
Factory="System.ServiceModel.Activation.ServiceHostFactory" %>

web.config

    <configuration>
    <connectionStrings>
      <add name="ApplicationServices"
         connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;      

       AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true"
         providerName="System.Data.SqlClient" />
      </connectionStrings>

     <system.web>
    <compilation debug="true" targetFramework="4.0" />

    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login.aspx" timeout="2880" />
    </authentication>

    <membership>
      <providers>
        <clear/>
        <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices"
             enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
             maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
             applicationName="/" />
      </providers>
    </membership>

    <profile>
      <providers>
        <clear/>
        <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/>
      </providers>
    </profile>

    <roleManager enabled="false">
      <providers>
        <clear/>
        <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" />
        <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />
      </providers>
    </roleManager>

  </system.web>

  <system.webServer>
     <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
</configuration>

【问题讨论】:

【参考方案1】:

您不需要序列化您希望返回的对象,.NET 将在幕后为您处理这一切。

像这样修改GetResults方法:

[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json)]
public List<Person> GetResults()

    List<Person> results = new List<Person>();
    results.Add(new Person("Peyton", "Manning", 35));
    results.Add(new Person("Drew", "Brees", 31));
    results.Add(new Person("Tony", "Romo", 29));

    return results;

希望这会有所帮助。

【讨论】:

真的,这样我就可以摆脱后续了?? // 将结果序列化为 JSON DataContractJsonSerializer serializer = new DataContractJsonSerializer(results.GetType()); MemoryStream memoryStream = new MemoryStream(); serializer.WriteObject(memoryStream, results); // 返回序列化为 JSON 字符串的结果 json = Encoding.Default.GetString(memoryStream.ToArray());返回 json; 我已经进行了修改,非常感谢您的建议。你知道我如何测试这个应用程序的输出吗?对不起,如果这是一个愚蠢的问题 如果您只需要看到它返回 JSON,您可以使用浏览器调用它:http://path/TestService.svc/GetResults 当前,当我运行我的应用程序时,我收到此错误 Microsoft JScript runtime error: 'JSON' is undefined :oS 啊,我想那是因为我从 VS 运行它,我尝试了 localhost/TestService.svc/GetResults,但页面只是空白。谢谢

以上是关于发出 JSON 的 WCF Web 服务(Noob 建议)的主要内容,如果未能解决你的问题,请参考以下文章

WCF Web 服务返回 json 格式数据

将 JSON 数组传递给 WCF Web 服务

移动应用程序和 Web 服务数据传输(WCF 和 JSON)

使用 WCF 创建需要身份验证并使用 JSON 作为输入/输出格式的 RESTful Web 服务

调用 WCF Web 服务时出现错误的 Json 响应

从 WCF REST Web 服务返回包装在回调函数中的 JSON