2013-12-18 3 views
2

Передача пользовательского объекта для работы REST WCF дает мне «ошибку с неправильным запросом». Я пробовал здесь как с uri path, так и с типом типа строки запроса. Любая помощь очень ценится.Передача сложного объекта для отдыха wcf

сторона Код услуги

[ServiceContract]  
public interface IRestService 
{  

    [OperationContract]   
    [WebInvoke(UriTemplate = "getbook?tc={tc}",Method="POST",BodyStyle=WebMessageBodyStyle.Wrapped,RequestFormat=WebMessageFormat.Json)] 
    string GetBook(myclass mc); 
} 

[DataContract] 
[KnownType(typeof(myclass))] 
public class myclass 
{ 
    [DataMember] 
    public string name { get; set; }   
} 

public string GetBookById(myclass mc) 
{    
    return mc.name; 
} 

код клиента сторона:

public static void GetString() 
{ 
    myclass mc = new myclass();    
    mc.name = "demo";   

    string jsn = new JavaScriptSerializer().Serialize(mc); 

    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(string.Format(@"http://localhost:55218/RestService.svc/getbook?mc={0}",jsn)); 

    string svcCredentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes("bda11d91-7ere-4da1-2e5d-24adfe39d174")); 
    req.Headers.Add("Authorization", "Basic " + svcCredentials); 
    req.MaximumResponseHeadersLength = 2147483647; 
    req.Method = "POST";   
    req.ContentType = "application/json"; 
    // exception is thrown here   
    using (WebResponse svcResponse = (HttpWebResponse)req.GetResponse()) 
    { 
     using (StreamReader sr = new StreamReader(svcResponse.GetResponseStream())) 
     { 
      JavaScriptSerializer js = new JavaScriptSerializer(); 
      string jsonTxt = sr.ReadToEnd(); 
     } 
    } 
} 

службы конфигурации

<basicHttpBinding> 
    <binding name="BasicHttpBinding_IService" closeTimeout="01:01:00" 
    openTimeout="01:01:00" receiveTimeout="01:10:00" sendTimeout="01:01:00" 
    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
    maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" 
    messageEncoding="Text" textEncoding="utf-8" transferMode="Streamed" 
    useDefaultWebProxy="true"> 
    <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" 
     maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
    <security mode="None"> 
     <transport clientCredentialType="None" proxyCredentialType="None" 
     realm="" /> 
     <message clientCredentialType="UserName" algorithmSuite="Default"/> 
    </security> 
    </binding> 
</basicHttpBinding> 

<webHttpBinding> 
    <binding name="" closeTimeout="01:01:00" openTimeout="01:01:00" 
    receiveTimeout="01:10:00" sendTimeout="01:01:00" allowCookies="false" 
    bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
    maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" 
    transferMode="Streamed" useDefaultWebProxy="true"> 
    <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
     maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
    <security mode="None" /> 
    </binding> 
</webHttpBinding> 
</bindings> 

<services> 
    <service name="WcfRestSample.RestService" behaviorConfiguration="ServiceBehavior"> 
    <endpoint address="" behaviorConfiguration="restfulBehavior" 
     binding="webHttpBinding" bindingConfiguration="" contract="WcfRestSample.IRestService" />   
    <!--<host> 
     <baseAddresses> 
     <add baseAddress="http://localhost/restservice" /> 
     </baseAddresses> 
    </host>--> 
    </service> 
</services> 
<!-- behaviors settings --> 
<behaviors>  

    <!-- end point behavior--> 
    <endpointBehaviors> 
    <behavior name="restfulBehavior">   
     <webHttp/>    
    </behavior> 
    </endpointBehaviors> 

    <serviceBehaviors> 
    <behavior name="ServiceBehavior"> 
     <serviceAuthorization serviceAuthorizationManagerType="WcfRestSample.APIKeyAuthorization, WcfRestSample" /> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </serviceBehaviors>  
</behaviors> 
<standardEndpoints> 
    <webHttpEndpoint> 
    <standardEndpoint 
     automaticFormatSelectionEnabled="true" 
     helpEnabled="true" /> 
</webHttpEndpoint> 
</standardEndpoints> 
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
</system.serviceModel> 
<system.webServer> 
<modules runAllManagedModulesForAllRequests="true" /> 
</system.webServer> 
+0

Вы используете атрибут Bodystyle, как завернуты, но я предполагаю, что запрос не обернута соответствующим образом. Можете ли вы изменить значение атрибута bodystyle на Bare и попробовать. Также, пожалуйста, ознакомьтесь с необработанным запросом с помощью Fiddler и отправьте запрос здесь, чтобы помочь вам – Rajesh

+0

. Отправьте также свой конфигурационный файл службы. – Tim

+0

Я обновил свой вопрос, который также включает конфигурацию сервисов. Здесь, в этом коде, я пытаюсь вызвать другую службу (т. Е. Service.svc), для которой я установил конфигурацию basichttpbinding. Звоните на эту вторую услугу, также вызывая ошибку с неправильным запросом. Я не знаю, где я ошибаюсь. –

ответ

0

Все вроде бы хорошо, за исключением того, что вы должны обернуть данные в обертку, и это, когда вы получаете данные JSon как {"mc":{"name":"Java"}} иначе вы получите только {"name":"Java"} который не обернуты запрос. Все это требуется, потому что вы установили WebMessageBodyStyle как Обернутый.

Ниже приведен код.

[OperationContract] 
      [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, RequestFormat = WebMessageFormat.Json)] 
      string GetBook(myclass mc); 

    [DataContract]  
     public class myclass 
     { 
      [DataMember] 
      public string name { get; set; } 
     } 

public string GetBook(myclass mc) 
      { 
       return mc.name; 
      } 

Клиент:

public class wrapper 
    { 
     public myclass mc; 
    } 
    public class myclass 
    { 
     public String name; 
    } 

    myclass mc = new myclass(); 
       mc.name = "Java"; 
       wrapper senddata = new wrapper(); 
       senddata.mc = mc; 
       JavaScriptSerializer js = new JavaScriptSerializer(); 
       ASCIIEncoding encoder = new ASCIIEncoding(); 
       byte[] data = encoder.GetBytes(js.Serialize(senddata)); 
       HttpWebRequest req2 = (HttpWebRequest)WebRequest.Create(String.Format(@"http://localhost:1991/Service1.svc/GetBook?")); 
       req2.Method = "POST"; 
       req2.ContentType = @"application/json; charset=utf-8"; 
       req2.MaximumResponseHeadersLength = 2147483647; 
       req2.ContentLength = data.Length; 
       req2.GetRequestStream().Write(data, 0, data.Length); 
       HttpWebResponse response = (HttpWebResponse)req2.GetResponse(); 
       string jsonResponse = string.Empty; 
       using (StreamReader sr = new StreamReader(response.GetResponseStream())) 
       { 
        jsonResponse = sr.ReadToEnd(); 
        Response.Write(jsonResponse); 
       } 

Надежда, что помогает ...

+0

Привет @Saranya, спасибо за ответ. Я проверю ваш код. –

Смежные вопросы