Загрузка изображения с использованием полного рабочего примера сервиса WCF RESTFul - PullRequest
3 голосов
/ 26 февраля 2012

В рамках довольно большого приложения мне нужно предоставить REST-сервис, который загружает изображение. Поскольку все приложение - .NET, я пытался найти работающий пример службы WCF RESTFul, которая делает это, но не может (которая определяет целые конфигурации). В Интернете есть несколько примеров, но я не смог (из-за недостатка знаний в WCF) ни один из них не сработал. (Я продолжаю получать исключения).

Я буду рад получить ссылку на рабочий.

Ответы [ 2 ]

8 голосов
/ 27 февраля 2012

Пожалуйста, найдите образец ниже:

На сервере:

Интерфейс:

[WebInvoke]
string PostImage(Stream stream);

Мой класс реализации:

public string PostImage(Stream stream)
        {
            byte[] buffer = new byte[10000];
            stream.Read(buffer, 0, 10000);
            FileStream f = new FileStream("C:\\temp\\sample.jpg", FileMode.OpenOrCreate);
            f.Write(buffer, 0, buffer.Length);
            f.Close();
            stream.Close();
            return "Recieved the image on server";
        }

ПРИМЕЧАНИЕ:Убедитесь, что у удостоверения вашего пула приложений-служб WCF есть доступ на запись в папку c: \ Temp для записи файла.В качестве альтернативы вы можете заменить логику, чтобы сохранить изображение в БД или любым другим способом.

Мой web.config на сервере:

<services>
      <service name="XMLService.Service1" behaviorConfiguration="default">
        <endpoint address="" behaviorConfiguration="web" binding="webHttpBinding" bindingConfiguration="RestBinding" name="Service1" contract="XMLService.IService1" />
      </service>
</services>
<behaviors>
      <endpointBehaviors>
        <behavior name="web">
          <webHttp />
        </behavior>
  <serviceBehaviors>        
    <behavior name="default">
      <dataContractSerializer maxItemsInObjectGraph="2147483647" />
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<webHttpBinding>
<binding name="RestBinding">
     <readerQuotas maxStringContentLength="5242880" maxArrayLength="16384" maxBytesPerRead="4096" />
     <security mode="None">            
     </security>
     </binding>
</webHttpBinding>

Теперь на моем клиенте у меня естьследующий код:

var client = new RestClient();
client.BaseUrl = "http://localhost/XMLService/Service1.svc";
var request = new RestRequest(method) { DateFormat = DataFormat.Xml.ToString(), Resource = resourceUrl };
if(requestBody !=null)
      request.AddParameter("objCompositeType", requestBody);
request.AddFile("stream", image, "Array.png");    
var response = client.Execute(request);
string responseString;
if (response.StatusCode == HttpStatusCode.OK)
{
     responseString = HttpUtility.HtmlDecode(response.Content);
}
else
{
     responseString = response.StatusDescription + " --------------------" + HttpUtility.HtmlDecode(response.Content);
}

Я использую сторонний инструмент RestSharp , чтобы отправить мой запрос в службу REST.

Мой запрос в Fiddler выглядит следующим образом:1023 *

POST http://localhost/XMLService/Service1.svc/PostImage HTTP/1.1
Accept: application/json, application/xml, text/json, text/x-json, text/javascript, text/xml
User-Agent: RestSharp 102.0.0.0
Host: rajeshwin7
Content-Type: multipart/form-data; boundary=-----------------------------28947758029299
Content-Length: 2300
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

-------------------------------28947758029299
Content-Disposition: form-data; name="stream"; filename="download.jpg"
Content-Type: application/octet-stream

�����JFIF����������C�       
!#'**%%+7,$3)1-,*4696A),,5���C  


6$$555,,)404,)6,51,5),)+)),,0,.044,),1),)),)))42,,,0,���"��"������������������.�������!1"AQ2a�#q�B�Rr���������������������������������1�����?��4��������������������ՇOF��¼�(�%�az�ROw����l"���Z��g}J�qWR��ʜR�K)�;���<&���G��kw���K���):1���������`�\�B;e(�:u"����.���_��QS�iB)�2�w�{��Q���k�%�e�xU�^�!Bw~��b�)����-,���e��=k���s��v���}�    ���$�}2}���o�>5N��Ҟ����YхL���T��)=��|�gu�B^ѕͽ&�:st���J�8ae�/�O-%��I���
ES��}�$��MI7',nK8̟xG���m��F��ʤ�K�g)�n^=�#ǎ1�����{P��
��U5)8��儞��8k��N�f����8�ʧu�S�M9��I�K8M�xY���������������j�EZӖ�[Y�O�ۓ(t�ޥH�W�K2�~�M�cn�����M_�����&�K��g������夳�l;��}%A�if�f��Q�MB{1�xofs�u�sX�qsW���T��)V���ʦ'��<���饎S���Y�t
�=�i�R�:nJsm�U̜T���-���,�6U��s��Nڞ���j�_�r�5OӜ��8�%������������������V���N��as���>_<J��v�:p�BݸO��A�&㕞q���>L}N���a{����տX�U�Ӣ�C���~�XϜe�]���3NrWZ���M(F�kd%'��{0���4�����U}M]J����ue���ia%��?���+K��n]��i���n����Mgң,����S��~�W�޶V�)m�95ы�Rm��q��ı��P�
m5_wjQ�ҩ��m,.��Rry^��o��}�O�y^9�N��MT�G��2�9G���+>7=^�^��J4��1�%%���*YMK�Z�s�5 )��Y�U�y:pj۹:*S�mU%�y���24��I)-�qĖ$�����C]�J�4�(�����⛬��d����g�fv�;R�԰��yO�+������������������([Z�VЎT�R�Jks�K���8Ͽ
�4�Wv6�m�6��K�y^y
��u������E��������'E�Pꗯu���ģ�
M5������8b�5{�ҧV�IB2\6��o̤���O���<�Ԛ�GVR��g�7��,<���<��|���Q��T���CRx�ӏ�>1��V���uj<�7'�r�O������������������)B֜�S�Y�ħ�����z�P�8W�$��n~�S�M�?u�<��������������������]����/�:j+n"���I��ܟ�?��,���'F�c�ytҕ%&�4��k9��0�����������������������i�[FP���9֡����7����,���h�S��_d����������������������%V�XSuj턽1sQ����yϟu��yŕ�i�)Е*�IŶ�W��Y�
&���K�H  ��������������������K�q
zRV�8�#:p���krk>�>�-�='�Ժ{��U}�e�
�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
-------------------------------28947758029299--

И когда я выполняю POST вышеуказанного запроса, я получаю следующий ответ:

HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 105
Content-Type: application/xml; charset=utf-8
Server: Microsoft-IIS/7.5
Set-Cookie: ASP.NET_SessionId=fdbg45tergdsfg434t; path=/; HttpOnly
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 27 Feb 2012 12:05:32 GMT

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Recieved the image on server</string>
2 голосов
/ 21 января 2016

Вот что я сделал:

Создание консольного приложения C # для Windows

class Program
{

    static void Main(string[] args)
    {
        Console.WriteLine("hello World");

        System.Uri url = new System.Uri("http://192.168.1.12:81/WebService/BIITAlumni.svc/UploadImage");
        string filePath = @"F:\temp\Desert.jpg";



            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Accept = "application/octet-stream";
            request.Method = "POST";
            request.ContentType = "image/jpeg";
            using (Stream fileStream = File.OpenRead(filePath))
            using (Stream requestStream = request.GetRequestStream())
            {
                int bufferSize = 1024;
                byte[] buffer = new byte[bufferSize];
                int byteCount = 0;
                while ((byteCount = fileStream.Read(buffer, 0, bufferSize)) > 0)
                {
                    requestStream.Write(buffer, 0, byteCount);
                }
            }
            string result;
            using (WebResponse response = request.GetResponse())
            using (StreamReader reader = new StreamReader(response.GetResponseStream()))
            {
            result = reader.ReadToEnd();
            }
            Console.WriteLine(result);
    }
  }

Создание нового проекта службы WCF, удаление namespace AlumniService из этого кода и замена собственного пространства имен такжеинтерфейс IBIITAlumni тоже

 namespace AlumniService{

 [ServiceContract]
 public interface IBIITAlumni
 {

    [OperationContract]
    [WebInvoke(
        Method = "POST",
        UriTemplate = "/UploadImage", 
        RequestFormat = WebMessageFormat.Json,
        ResponseFormat = WebMessageFormat.Json)]

    public string UploadImage(Stream stream)
    {
        byte[] buffer = new byte[10000];
        stream.Read(buffer, 0, 10000);
        FileStream f = new FileStream(@"C:\Users\shahzad\Documents\Visual Studio 2013\Projects\AlumniService\FileUpload\sample.jpg", FileMode.OpenOrCreate);
        f.Write(buffer, 0, buffer.Length);
        f.Close();
        stream.Close();
        return "Recieved the image on server";
    }

   }
 }

Изменения в web.config

<system.serviceModel>
<bindings>
  <webHttpBinding>
    <binding name="ServiceWebBindingName" transferMode="Streamed" maxReceivedMessageSize="2147483647" >
      <readerQuotas  maxArrayLength="2147483647" maxStringContentLength="2147483647" />
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Windows"></transport>
      </security>
    </binding>
  </webHttpBinding>
</bindings>

   <!-- your other configuration goes  here-->
</system.serviceModel>

Наслаждайтесь!

...