powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / WCF REST+POST из Silverlight
9 сообщений из 9, страница 1 из 1
WCF REST+POST из Silverlight
    #36017298
S_A_V_e
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.

Пытаюсь разобраться с WCF REST. Для запросов GET всё получилось. Но вот с POST проблемы... Приведу для начала код клиента и сервиса:

WCF сервис:

Интерфейс:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
[ServiceContract]    
    public interface IWCFService
    {        

        // TODO: Add your service operations here

        // Вызывается методом GET
        [OperationContract]
        [WebGet]
        int DoWork();

        // Вызывается методом POST
        [OperationContract]
        [WebInvoke(UriTemplate = "DoWork1")]
        string DoWork1(SampleItem item);
}


Реализация интерфейса:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
public class WCFService : IWCFService
    {        

        
        // Этот метод через GET вызывается (можно прямо из браузера проверить)
        public int DoWork()
        {
            
            return 10;

        }
        // До вызова этого метода с клиента не доходит (через POST)
        public string DoWork1(SampleItem item)
        {
            return item.Value;
        }
}

Клиент (Silverlight)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
void Page_Loaded(object sender, RoutedEventArgs e)
        {
            WebClient client = new WebClient();

            Uri uri = new Uri("http://localhost/REST.WCF/WCFService.svc/DoWork1");            

            client.UploadStringCompleted += new UploadStringCompletedEventHandler(client_UploadStringCompleted);
            client.Encoding = Encoding.UTF8;
            string content = "<SampleItem xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"><Value>Orange</Value> </SampleItem>";
            client.Headers[HttpRequestHeader.ContentType] = "text/xml";
            client.UploadStringAsync(uri, "POST", content);
}

Класс SampleItem:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
[DataContract]
    public class SampleItem
    {
        string sValue;
        [DataMember]
        public string Value 
        {
            get { return sValue; }
            set { sValue = value; }
        }
    }

web.config
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
<system.serviceModel>
    
    <services>
      <service behaviorConfiguration="REST.WCF.WCFServiceBehavior" name="REST.WCF.WCFService">        
        <endpoint address="" binding="webHttpBinding" behaviorConfiguration="webBehavior"  contract="REST.WCF.IWCFService" >
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    
    <behaviors>
      
      <endpointBehaviors>        
        <behavior name="webBehavior">
          <webHttp/>        
      </behavior>
      </endpointBehaviors>
      

      <serviceBehaviors>
        
        <behavior name="REST.WCF.WCFServiceBehavior">
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"  />
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>    
    
  </system.serviceModel>

С файлом clientaccesspolicy.xml то же всё в порядке.

При вызове сервиса DoWork1 методом POST возникает Exception с сообщением "The remote server returned an error: NotFound". Причём DoWork методом GET вызывается с того же сервиса.

Подскажите пожалуйста где же ошибка ? Перекопал весь инет , но никаких особых отличий от своего кода в примерах не нашел...
...
Рейтинг: 0 / 0
WCF REST+POST из Silverlight
    #36019753
S_A_V_e
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кое что прояснилось... частично даже заработало.
Попробовал сделать так:
В интерфейс добавил метод

Код: plaintext
1.
2.
3.
4.
5.
[OperationContract]
        [WebInvoke(Method = "POST",
        BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Xml,
        ResponseFormat = WebMessageFormat.Xml, UriTemplate = "/SayHello")]
        string SayHello(string name);
реализация:

Код: plaintext
1.
2.
3.
4.
public string SayHello(string name) 
        {
            return name;
        }
На клиенте Content-Type поменял и сделал вызов метода

Код: plaintext
1.
2.
3.
4.
5.
Uri uri = new Uri("http://home/REST.WCF/WCFService.svc/SayHello");
...
client.Headers[HttpRequestHeader.ContentType] = "application/xml; charset=utf-8";
string content = "<string xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/\">Foo</string>";
client.UploadStringAsync(uri, "POST", content);

Вызов прошел и данные вернулись на клиент. Так что думаю с конфигом и привязками всё в порядке.Но передать XML по прежнему не получается. Т.е. скорее всего вопрос в том как привильно написать xml для запроса что бы сериализатор его понял.

При попытке передать в запросе xml
Код: plaintext
1.
string content = "<SampleItem xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"><Value>Orange</Value></SampleItem>";

сервер возвращает 400 Bad Request
...
Рейтинг: 0 / 0
WCF REST+POST из Silverlight
    #36020301
Фотография Roman S. Golubin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
S_A_V_e,

так пробовал?

Код: plaintext
string content = "<myns:SampleItem xmlns:myns=\"uri:myns\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"><myns:Value>Orange</myns:Value></myns:SampleItem>";
...
Рейтинг: 0 / 0
WCF REST+POST из Silverlight
    #36020722
S_A_V_e
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал такие варианты:
Код: plaintext
1.
2.
3.
4.
5.
string content = "<myns:SampleItem xmlns:myns=\"http://home/REST.WCF/WCFService.svc\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"><myns:Value>Orange</myns:Value></myns:SampleItem>";

string content = "<myns:SampleItem xmlns:myns=\"http://home/REST.WCF\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"><myns:Value>Orange</myns:Value></myns:SampleItem>";

string content = "<myns:SampleItem xmlns:myns=\"REST.WCF\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"><myns:Value>Orange</myns:Value></myns:SampleItem>";

Но результат тот же.
...
Рейтинг: 0 / 0
WCF REST+POST из Silverlight
    #36115380
S_A_V_e
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема решена. Вот решение:
Интерфейс:
Код: plaintext
1.
2.
3.
4.
5.
6.
[OperationContract]
        [WebInvoke(Method = "POST",
        BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Xml,
        ResponseFormat = WebMessageFormat.Xml, UriTemplate = "/GetSampleItem1")]
        SampleItem GetSampleItem1(SampleItem item);

Реализация интерфейса:
Код: plaintext
1.
2.
3.
4.
public SampleItem GetSampleItem1(SampleItem item) 
        {
            return item;
        }
Код клиента:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
void UsePOST() 
        {
 WebClient client = new WebClient();
            Uri uri = new Uri("http://home/REST.WCF/WCFService.svc/GetSampleItem1");
            client.UploadStringCompleted += new UploadStringCompletedEventHandler(client_UploadStringCompleted);
            client.Encoding = Encoding.UTF8;            
            
            string content = "<SampleItem xmlns=\"http://schemas.datacontract.org/2004/07/REST.WCF\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"><Value>qwerty</Value></SampleItem>";
            client.Headers[HttpRequestHeader.ContentType] = "application/xml; charset=utf-8";
            
            client.UploadStringAsync(uri, "POST", content);
        }

void client_UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)
        {
            // Получение ответа сервера при вызове методом POST 
            txtResult.Text = e.Result;
        }

Проблема была в формате XML используемого для сериализации объекта. Подсмотреть правильный формат удалось вернув объект с сервера.
...
Рейтинг: 0 / 0
WCF REST+POST из Silverlight
    #36426136
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а можно приложить сюда проект целиком
...
Рейтинг: 0 / 0
WCF REST+POST из Silverlight
    #36444910
S_A_V_e
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.к. не первый раз просят исходники тестового проекта , прилагаю архив с проектом.
...
Рейтинг: 0 / 0
WCF REST+POST из Silverlight
    #36444920
Фотография bured
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
S_A_V_e,

tnx
...
Рейтинг: 0 / 0
WCF REST+POST из Silverlight
    #36489371
guest2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавить в конфиг wcf-сервиса
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel"
              switchValue="Information, ActivityTracing"
              propagateActivity="true">
        <listeners>
          <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData= "wcf.svclog" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>
и смотреть в файле wcf.svclog что происходит.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / WCF REST+POST из Silverlight
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]