【问题标题】:How to configure WCF services如何配置 WCF 服务
【发布时间】:2014-01-12 21:16:15
【问题描述】:

我是使用 WCF 服务的新手,希望您能帮助我解决一些调用外部 REST Web 服务的问题。我创建了两个应用程序来尝试测试我的服务。

  1. 用于测试我的类库的控制台应用程序
  2. 托管我的服务的 umbraco 应用程序

两个本地主机。

这是我的服务代码:

 namespace HorecaWebservices.Webservices
{
    [ServiceContract]
    public interface IWS_Test
    {
        [OperationContract]
        [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json,     ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
         Agenda GetAgenda(String mobileAppKey);
     }
 }

 namespace HorecaWebservices.Webservices
 {

     public class WS_Test : IWS_Test
     {
         public Agenda GetAgenda(String mobileAppKey)
         {
             return BL_Agenda.GetAgenda(mobileAppKey);
         }
     }
 }

我的服务的网络配置:

   <system.serviceModel>
     <behaviors>
       <serviceBehaviors>
         <behavior name="MyServiceTypeBehaviors">
           <serviceMetadata httpGetEnabled="true" />
           <serviceDebug includeExceptionDetailInFaults="true" />
         </behavior>
       </serviceBehaviors>
     </behaviors>
     <standardEndpoints>
       <webHttpEndpoint>
         <standardEndpoint name="" helpEnabled="true"
             automaticFormatSelectionEnabled="true"
             defaultOutgoingResponseFormat="Json">
         </standardEndpoint>
       </webHttpEndpoint>
     </standardEndpoints>
     <services>
       <service name="HorecaWebservices.Webservices.WS_Test"
              behaviorConfiguration="MyServiceTypeBehaviors">
         <endpoint address="" binding="wsHttpBinding"
              contract="HorecaWebservices.Webservices.IWS_Test"/>
         <endpoint contract="IMetadataExchange"
            binding="mexHttpBinding" address="mex"/>
       </service>
     </services>
   </system.serviceModel>

这是我的控制台应用程序中调用服务方法的代码:

    public static class BL_Agenda
    {
        public static Agenda GetAgenda()
        {
            Agenda agenda = new Agenda();

            WebRequest request = WebRequest.Create("http://localhost:63462/Webservices/WS_Test.svc/GetAgenda");

            request.Method = "POST";
            request.ContentType = "application/json; charset=utf-8";

            string postData = "{\"mobileAppKey\":\"HEMDZ\"}"; //encode your data 



            using (Stream s = request.GetRequestStream())
            {
                using (StreamWriter sw = new StreamWriter(s))
                    sw.Write(postData);

                s.Close();
            }


            try
            {
                using (Stream s = request.GetResponse().GetResponseStream())
                {
                    using (StreamReader sr = new StreamReader(s))
                    {
                        var jsonData = sr.ReadToEnd();

                        agenda = JsonConvert.DeserializeObject<Agenda>(jsonData);
                    }

                    s.Close();
                }
            }

            catch (WebException e)
            {
                agenda = null;
                WebExceptionStatus status = e.Status;
                Console.WriteLine(status.ToString());
            }

            return agenda;
        }

现在,每当我运行此代码时,request.GetResponse() 都会抛出 System.Net.WebException "(415) 无法处理消息,因为内容类型 'application/json; charset=utf-8' 不是预期的类型'应用程序/soap+xml; charset=utf-8'"

经过几个小时试图找出问题所在,我仍然无法弄清楚。有人可以帮我解决这个问题吗?

【问题讨论】:

  • 您已在 web.config 中定义了您的 service 以使用 WsHttpBinding,这是一个基于 XML 的 SOAP 绑定 - 而不是 JSON -based REST-binding 您似乎期望在客户端。对于 REST,请在服务器端使用 webHttpBinding

标签: wcf service config


【解决方案1】:

乍一看,您的端点使用了错误的绑定 (wsHttpBinding):

<endpoint address="" binding="wsHttpBinding" contract="HorecaWebservices.Webservices.IWS_Test"/>

而应该是webHttpBinding:

<endpoint address="" binding="webHttpBinding" contract="HorecaWebservices.Webservices.IWS_Test"/>

如需完整的 webHttp-sample 绑定,请查看这篇文章:http://weblogs.asp.net/kiyoshi/archive/2008/10/08/wcf-using-webhttpbinding-for-rest-services.aspx

更改绑定时可能会出现其他问题。一件事是,您可能不再需要&lt;standardEndpoints&gt;-node。所以我建议靠近链接的样本。

此外,激活tracing 总是一个好主意。激活跟踪后,您将获得有关 500 错误(可能还有其他错误)的更详细信息。

【讨论】:

  • 您好 JME,首先感谢您的快速回复!所以我已将 web.config 修改为 webHttpBinding,现在它引发了 (500)Internal server error.. :(。我会尝试检查你给我的链接。Thnx
  • 您好 JME,我已经删除了我的 webconfig 中的 节点。 Thnx 提供有关跟踪的提示,一旦我弄清楚如何激活它,我希望获得有关我的 400 错误请求错误的更多信息。谢谢!
【解决方案2】:

【讨论】:

  • 您好,威廉,谢谢您的回复!我已将工厂添加到我的 svc 文件中,但仍然没有帮助.. 将绑定设置为 webHttpBinding 后,我现在收到 400 Bad request 错误..
【解决方案3】:

我明白了!我终于解决了错误的请求错误。我不得不将 BodyStyle = WebMessageBodyStyle.Bare 设置替换为 BodyStyle = WebMessageBodyStyle.WrappedRequest。

感谢所有帮助的人!

【讨论】:

    猜你喜欢
    • 2011-03-09
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 2011-07-26
    • 2013-06-10
    • 2011-10-04
    • 2017-12-17
    • 2014-03-28
    相关资源
    最近更新 更多