繁体   English   中英

WCF服务不喜欢我的内容类型

[英]WCF Service Doesn't Like My Content-Type

我正在使用WCF构建一组Rest Services。 我正在使用邮递员发出测试请求。 一切都进行得很好,直到我想在请求标头中指定“ Content-Type”。

服务合同:

[OperationContract]
  [WebInvoke(Method = "POST",
              UriTemplate = "data")]
  Stream GetData(Stream iBody);

及其背后的代码:

public Stream GetData(Stream iBody) {
     StreamReader objReader = new StreamReader(iBody);
     string strBody = objReader.ReadToEnd();

     XmlDocument objDoc = new XmlDocument();
     objDoc.LoadXml(strBody);

     return GetStreamData("Hello There. " + objDoc.InnerText);
}

private Stream GetStreamData(string iContent) {
     byte[] resultBytes = Encoding.UTF8.GetBytes(iContent);
     return new MemoryStream(resultBytes);
}

只要我在请求标头中不包含“ text / xml”值的“ Content-Type”,这一切都可以正常工作。

附: 在此处输入图片说明

无: 在此处输入图片说明

我也尝试了“ text / xml; charset = utf-8”和“ application / xml”的组合,但均无济于事。 它与服务方法接受的类型有关吗? 任何指针将不胜感激。

由于您在WCF服务中使用原始编程模型 (使用Stream作为参数/返回类型),因此您需要告诉WCF堆栈不要尝试将XML内容类型的传入请求解释为XML,而是让它通过。 您可以使用WebContentTypeMapper做到这一点,它将所有传入的请求(无论它们的内容类型如何)都映射到原始模式。 顶部链接的博客文章提供了有关此内容的更多信息,下面的代码显示了处理您的案例的映射器的示例。

public class StackOverflow_35750073
{
    [ServiceContract]
    public class Service
    {
        [OperationContract]
        [WebInvoke(Method = "POST", UriTemplate = "data")]
        public Stream GetData(Stream iBody)
        {
            StreamReader objReader = new StreamReader(iBody);
            string strBody = objReader.ReadToEnd();

            XmlDocument objDoc = new XmlDocument();
            objDoc.LoadXml(strBody);

            return GetStreamData("Hello There. " + objDoc.InnerText);
        }
        private Stream GetStreamData(string iContent)
        {
            byte[] resultBytes = Encoding.UTF8.GetBytes(iContent);
            return new MemoryStream(resultBytes);
        }
    }
    class RawMapper : WebContentTypeMapper
    {
        public override WebContentFormat GetMessageFormatForContentType(string contentType)
        {
            return WebContentFormat.Raw;
        }
    }
    public static void Test()
    {
        string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
        ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
        ServiceEndpoint endpoint1 = host.AddServiceEndpoint(
            typeof(Service),
            new WebHttpBinding { ContentTypeMapper = new RawMapper() },
            "withMapper");
        endpoint1.Behaviors.Add(new WebHttpBehavior());

        ServiceEndpoint endpoint2 = host.AddServiceEndpoint(
            typeof(Service), 
            new WebHttpBinding(),
            "noMapper");
        endpoint2.Behaviors.Add(new WebHttpBehavior());

        host.Open();
        Console.WriteLine("Host opened");

        var input = "<hello><world>How are you?</world></hello>";
        Console.WriteLine("Using a Content-Type mapper:");
        SendRequest(baseAddress + "/withMapper/data", "POST", "text/xml", input);
        SendRequest(baseAddress + "/withMapper/data", "POST", null, input);

        Console.WriteLine("Without using a Content-Type mapper:");
        SendRequest(baseAddress + "/noMapper/data", "POST", "text/xml", input);
        SendRequest(baseAddress + "/noMapper/data", "POST", null, input);

        Console.Write("Press ENTER to close the host");
        Console.ReadLine();
        host.Close();
    }
    public static string SendRequest(string uri, string method, string contentType, string body)
    {
        string responseBody = null;

        HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(uri);
        req.Method = method;
        if (!String.IsNullOrEmpty(contentType))
        {
            req.ContentType = contentType;
        }

        if (body != null)
        {
            byte[] bodyBytes = Encoding.UTF8.GetBytes(body);
            req.GetRequestStream().Write(bodyBytes, 0, bodyBytes.Length);
            req.GetRequestStream().Close();
        }

        HttpWebResponse resp;
        try
        {
            resp = (HttpWebResponse)req.GetResponse();
        }
        catch (WebException e)
        {
            resp = (HttpWebResponse)e.Response;
        }

        if (resp == null)
        {
            responseBody = null;
            Console.WriteLine("Response is null");
        }
        else
        {
            Console.WriteLine("HTTP/{0} {1} {2}", resp.ProtocolVersion, (int)resp.StatusCode, resp.StatusDescription);
            foreach (string headerName in resp.Headers.AllKeys)
            {
                Console.WriteLine("{0}: {1}", headerName, resp.Headers[headerName]);
            }
            Console.WriteLine();
            Stream respStream = resp.GetResponseStream();
            if (respStream != null)
            {
                responseBody = new StreamReader(respStream).ReadToEnd();
                Console.WriteLine(responseBody);
            }
            else
            {
                Console.WriteLine("HttpWebResponse.GetResponseStream returned null");
            }
        }

        Console.WriteLine();
        Console.WriteLine("  *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*  ");
        Console.WriteLine();

        return responseBody;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM