REST WCF服务返回XML响应,但不返回JSON响应

Fle*_*lea 3 wcf

我是WCF的新手,所以我认为这是非常基础的.我有一个简单的方法,返回一个"订单"对象.它在使用默认XML时工作得很好,但是,当我应用时

ResponseFormat = WebMessageFormat.Json
Run Code Online (Sandbox Code Playgroud)

属性,它无法返回JSON.代码成功执行并命中返回行,但随后立即再次调用该方法,最后在浏览器返回错误之前第三次调用,表明与localhost的连接已中断.

当我删除它时ResponseFormat = WebMessageFormat.Json,调用该方法并返回XML就好了.不确定我是否缺少JSON.

IProductSales.cs

namespace ProductsSalesService
{
    [ServiceContract(Name = "ProductsSales")]
    public interface IProductsSales
    {

        [OperationContract]
        [WebGet(UriTemplate = "Orders/{orderID}", ResponseFormat = WebMessageFormat.Json)]
        [Description("Returns the details of an order")]
        SalesOrderHeader GetOrder(string orderID);

    }
}
Run Code Online (Sandbox Code Playgroud)

ProductSales

public SalesOrderHeader GetOrder(string orderID)
{
    SalesOrderHeader header = null;

    try
    {
        int id = Convert.ToInt32(orderID);
        AdventureWorksEntities database = new AdventureWorksEntities();

            header = (from order in database.SalesOrderHeaders
                      where order.SalesOrderID == id
                      select order).FirstOrDefault();

    }
    catch
    {
        throw new WebFaultException(HttpStatusCode.BadRequest);
    }

    return header;
}
Run Code Online (Sandbox Code Playgroud)

我正在研究WCF书中的一个示例,所以他们让我构建了一个小型控制台应用程序作为主机,所以这是我为主机客户端提供的app.config文件.

<?xml version="1.0"?>
<configuration>
  <connectionStrings>
    <add name="AdventureWorksEntities" connectionString="metadata=res://*/ProductsSalesModel.csdl|res://*/ProductsSalesModel.ssdl|res://*/ProductsSalesModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=BINGBONG;Initial Catalog=AdventureWorks;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup><system.serviceModel>
    <services>
      <service name="ProductsSalesService.ProductsSales">
        <endpoint address="http://localhost:8000/Sales" binding="webHttpBinding"
          bindingConfiguration="" name="ProductsSalesService.ProductsSales"
          contract="ProductsSalesService.IProductsSales" />
      </service>
    </services>
  </system.serviceModel>
</configuration>
Run Code Online (Sandbox Code Playgroud)

最后,这只是主机客户端代码.

public class Program
    {
        static void Main(string[] args)
        {
            WebServiceHost host = new WebServiceHost(typeof(ProductsSalesService.ProductsSales));
            host.Open();
            Console.WriteLine("Service running");
            Console.WriteLine("Press ENTER to stop the service");
            Console.ReadLine();
            host.Close();
        }
    }
Run Code Online (Sandbox Code Playgroud)

因此,当我去http://localhost:8000/Sales/Orders/43659取消订单时,它会点击三次,并且该页面会在Chrome中取消,并显示以下错误:

此网页不可用与localhost的连接中断.以下是一些建议:稍后重新加载此网页.检查您的Internet连接.重新启动可能正在使用的任何路由器,调制解调器或其他网络设备.在防火墙或防病毒软件的设置中添加Google Chrome作为允许的程序.如果它已经是允许的程序,请尝试从允许的程序列表中删除它并再次添加它.如果使用代理服务器,请检查代理设置或联系网络管理员以确保代理服务器正常工作.如果您认为自己不应该使用代理服务器,请调整代理设置:转到扳手菜单>设置>显示高级设置...>更改代理设置...

LAN设置并取消选中"为LAN使用代理服务器"复选框.错误101(net :: ERR_CONNECTION_RESET):连接已重置.

如果我删除WebMessageFormat.Json一切正常!

谢谢你的帮助!

And*_*ens 5

对于初学者来说,尝试WCF跟踪/记录以查看它是否能够解决问题.

把它放在服务器的配置文件中(<configuration>元素中的某个地方): -

<system.diagnostics>
 <sources>
  <source name="System.ServiceModel" switchValue="Error" propagateActivity="true">
    <listeners>
      <add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData="C:\Temp\server.svclog"/>
    </listeners>
  </source>
  <source name="System.ServiceModel.MessageLogging">
    <listeners>
      <add name="messages"
      type="System.Diagnostics.XmlWriterTraceListener"
      initializeData="C:\Temp\server_messages.svclog" />
    </listeners>
  </source>
 </sources>
</system.diagnostics>
Run Code Online (Sandbox Code Playgroud)

把它放在<system.serviceModel>元素内: -

<diagnostics>
  <messageLogging
       logEntireMessage="true"
       logMalformedMessages="false"
       logMessagesAtServiceLevel="true"
       logMessagesAtTransportLevel="false"
       maxMessagesToLog="3000"
       maxSizeOfMessageToLog="2000"/>
</diagnostics>
Run Code Online (Sandbox Code Playgroud)

尝试再次点击你的服务并检查这个(希望)为线索生成的.svclog文件.这些文件将在"服务跟踪查看器"工具中打开 - 如果没有,可以从MS下载(我认为是Win SDK的一部分).