我不能在REST服务中发送字节数组作为参数? (附代码)

时间:2011-11-13 10:42:54

标签: wcf

我正在使用WCF创建一些REST服务。 其中一个Rest Service方法需要将字节数组作为参数(图片为字节数组)并返回一些对象。 我使用IIS运行此服务。 但这不起作用。

我写的代码:

[ServiceContract]
public interface IPicService
{
    [OperationContract, WebInvoke(Method="POST", UriTemplate = "GetPicReport/{imageName}")]
    Report GetPicReport( string imageName, Stream image );

}

[ServiceBehavior( AddressFilterMode = AddressFilterMode.Any )]
public class PicService: IPicService
{
    public Report GetPicReport( string imageName, Stream image )
    {
        return new Report ();
    }
}

我使用资源管理器检查此代码 - 但是我收到有关缺少参数(图像流)的错误

我该如何测试? 我不能使用WCF测试客户端 - 所以我编写了创建http调用的简单应用程序 - 此方法返回错误404(未找到服务器)

2 个答案:

答案 0 :(得分:1)

帖子here展示了如何像您的一样实施服务,以及测试客户端(使用HttpWebRequest)。您可以做的另一件事是在服务器上启用跟踪,它可能会告诉您为什么请求被拒绝。

答案 1 :(得分:1)

您可以尝试以下代码:

var request = WebRequest.Create(string.Concat(serviceUrl, resourceUrl)) as HttpWebRequest;

        if (request != null)
        {
            request.ContentType = "text/xml";
            request.Method = method;
        }

        //var objContent = HttpContentExtensions.CreateDataContract(requestBody);
        if(method == "POST" && requestBody != null)
        {
            //byte[] requestBodyBytes = ToByteArrayUsingXmlSer(requestBody, "http://schemas.datacontract.org/2004/07/XMLService");
            byte[] requestBodyBytes = ToByteArrayUsingDataContractSer(requestBody);
            request.ContentLength = requestBodyBytes.Length;
            using (Stream postStream = request.GetRequestStream())
                postStream.Write(requestBodyBytes, 0, requestBodyBytes.Length);
            //request.Timeout = 60000;
        }

        if (request != null)
        {
            var response = request.GetResponse() as HttpWebResponse;
            if(response.StatusCode == HttpStatusCode.OK)
            {
                Stream responseStream = response.GetResponseStream();
                if (responseStream != null)
                {
                    var reader = new StreamReader(responseStream);

                    responseMessage = reader.ReadToEnd();
                }
            }
            else
            {
                responseMessage = response.StatusDescription;
            }
        }