2016-04-13 30 views
0

Etki alanları arası bir arama için kullanmaya çalıştığım bir WCF hizmeti oluşturdum (jQuery ve JSONP kullanarak). Hizmeti yazdım ve Visual Studio'da hata ayıklayıcısında çalıştırdığımda ve yerel bilgisayarımdaki bir sınama sayfasından çağırdığımda gayet iyi çalışıyor. Sunucumuzu IIS7'ye dağıttığımızda sunucumuz çalışmıyor. Fiddler'la baktığımızda, bir 400 hatanın geldiğini görüyorum. WCF JSONP web hizmeti yöntemini çağırırken hata 400 hatası

Bu bir WCF hizmeti oluşturmada ilk denemem ve aynı zamanda JSONP'de ilk denememdir, bu yüzden çok basit ama önemli bir şeyi kaçırdım. Sadece (yani sadece URL koyabilirsiniz temel servis işlevselliğini sınamak için bu bir yarattı -

Sadece bir dize alır ve döndürür bu hizmetin, (GetData denir) bir gerçekten basit bir 2 yöntemleri var bir tarayıcıya ve biraz json alıyorum) ve tamam çalışıyor.

diğer problemli, (GetMatter denir) bir, parametrelerin bir çift alır bazı verileri almak için başka (SOAP) web hizmeti çağırır ve benim geri arama işlevi çağrısı içeren bir Akışı döndürür. Bu, sonucu görüntüleyen arama sayfasına eklenir.

sözleşme şuna benzer:

uygulama şöyle
[ServiceContract] 
public interface IOracleService 
{ 

    [OperationContract] 
    [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "getData/{value}")] 
    string GetData(string value); 

    [OperationContract] 
    [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "getMatter/{matterId}/{callback}")] 
    Stream GetMatter(string matterId, string callback); 


} 

:

Benim basit Test.html sayfası bu testin amaçları için (şuna benzer
public class OracleService : IOracleService 
{ 
    public string GetData(string value) 
    { 
     return string.Format("You entered: {0}", value); 
    } 


    public Stream GetMatter(string matterId, string callback) 
    { 

     //call web service 
     var serviceResult = <call to web service goes here>; 

     //serialize data to json 
     JavaScriptSerializer js = new JavaScriptSerializer(); 
     string jsonResult = js.Serialize(serviceResult.data); 
     jsonResult = jsonResult.Substring(1, jsonResult.Length - 2); 

     string result = callback + "(" + jsonResult + ");"; 

     return new MemoryStream(Encoding.UTF8.GetBytes(result)); 

    } 

} 

, js dosyası sürücü): sadece benim yerel Q depolanan şöyle

<html> 

<head> 
    <script src="./jquery-2.2.2.min.js" type="text/javascript"></script> 
</head> 

<body> 

    <div id="output"></div> 
    <div id="output2"></div> 

    <script language="javascript"> 
    var url = "Q:\TestService.js"; 

    var script = document.createElement("script"); 
    script.setAttribute("src", url); 
    script.setAttribute("type", "text/javascript"); 
    document.body.appendChild(script); 
    </script> 


</body> 

</html> 

TestService.js olduğunu (dikkat Ser vice.Legal, OracleService'nin tanımlandığı ad alanıdır ve MyServer, hizmeti dağıtdığım sunucunun adıdır. ayıklayıcısında çalıştırırken, Sunucum olarak değiştirilir "localhost: portnumber" ve bu sonra Tamam çalışır)

var url = "http://MyServer/Service.Legal.OracleWebService/OracleService.svc/GetData/1"; 

url += "?" + new Date().getTime().toString(); //append time to prevent caching 


var script = document.createElement("script"); 
script.setAttribute("src", url); 
script.setAttribute("type", "text/javascript"); 
document.body.appendChild(script); 


function ServiceCallback(data) { 
    console.log("got data: "); 
    console.dir(data); 

    var result = data; 
    var date = new Date(parseInt(result.INVOICE_DATE.substr(6))); 

    var output = "<ul>"; 
    output += "<li>INVOICE DATE: " + date + "</li>"; 
    output += "<li>TOTAL EXCL GST: " + result.TOTAL_EXCL_GST + "</li>"; 
    output += "<li>FEE ESTIMATE: " + result.FEE_ESTIMATE + "</li>"; 
    output += "</ul>"; 

    $("#output").html(output); 

} 

Son olarak, web.config benziyor:

<configuration> 
 

 
    <system.web> 
 
    <compilation debug="true" targetFramework="4.0" /> 
 
    <authentication mode="Windows" /> 
 
    </system.web> 
 
    <system.serviceModel> 
 
    <bindings> 
 
     <webHttpBinding> 
 
     <binding name="webHttpBinding" crossDomainScriptAccessEnabled="true"> 
 
      <security mode="Transport"> 
 
      <transport clientCredentialType="None" /> 
 
      </security> 
 
     </binding> 
 
     </webHttpBinding> 
 
    </bindings> 
 
    <client /> 
 
    <services> 
 
     <service name="Service.Legal.OracleWebService.OracleService"> 
 
     <endpoint address="" binding="webHttpBinding" contract="Service.Legal.OracleWebService.IOracleService" behaviorConfiguration="webBehaviour" /> 
 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
 
     <host> 
 
      <baseAddresses> 
 
      <add baseAddress="http://MyServer/Service.Legal.OracleWebService/" /> 
 
      </baseAddresses> 
 
     </host> 
 
     </service> 
 
    </services> 
 
    <behaviors> 
 
     <endpointBehaviors> 
 
     <behavior name="webBehaviour"> 
 
      <webHttp/> 
 
     </behavior> 
 
     </endpointBehaviors> 
 
     <serviceBehaviors> 
 
     <behavior> 
 
      <serviceMetadata httpGetEnabled="true" /> 
 
      <serviceDebug includeExceptionDetailInFaults="false" /> 
 
     </behavior> 
 
     </serviceBehaviors> 
 
    </behaviors> 
 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
 
    </system.serviceModel> 
 
    <system.webServer> 
 
    <httpProtocol> 
 
     <customHeaders> 
 
     <add name="Access-Control-Allow-Origin" value="*" /> 
 
     <add name="Access-Control-Allow-Headers" value="Content-Type, Accept" /> 
 
     </customHeaders> 
 
    </httpProtocol> 
 
    <modules runAllManagedModulesForAllRequests="true" /> 
 
    <directoryBrowse enabled="true" /> 
 
    <httpErrors errorMode="Detailed" /> 
 
    <validation validateIntegratedModeConfiguration="false" /> 
 
    </system.webServer> 
 

 
</configuration>

Yukarıda belirttiğim gibi, Visual Studio hata ayıklayıcısında bu hizmeti çalıştırdığımda, html sayfam javascript'i TestService.js'de çalıştırır, javascript benim hizmetimi çağırır (http://localhost:15021/OracleService.svc/GetMatter/matterId/ServiceCallback) ve sonuçta beklenen verilerin görüntülenmesini beklerim. sayfa. Ben sunucusu (http://MyServer/Service.Legal.OracleWebService/OracleService.svc/GetMatter/matterId/ServiceCallback) işaret etmek bu hizmet url değiştirdiğinizde

, ben boş bir sayfa almak ve Fiddler doğrudan tarayıcıda hatayı 400.

web hizmetinin temel bir testini vererek istek gösterilmektedir

http://MyServer/Service.Legal.OracleWebService/OracleService.svc/getData/1 
, beklenen json verilerini döndürür (her ne kadar IE sadece açmak veya kaydetmek istediğimi sorar "1.json", tarayıcıda hiçbir şey göstermiyor), böylece hizmetin kendisi erişilebilir görünüyor ve IIS'de Tamam çalışıyor. GetMatter işlevimde veya sunucuda çalışmasını engelleyen bir şekilde yanlış bir şey var gibi görünüyor.

cevap

0

Hmm Tamam boşver, sanırım yanlış soruna bakıyordum.

400 (kötü istek) hatası, sorunun web hizmetimden çağrılması ile ilgili olduğunu düşündüm. Ancak, web servisim diğer web servisini aramaya çalıştığında, sunucu tarafında sorun oluyor gibi görünüyor. Bu çağrıyı diğer web servisine götürdüğümde, servisim bunun yerine 200 (başarı) verdi. Elimde olanın (yukarıda kaydedildiği gibi) doğru olduğunu ve sorunun diğer web servisine yapılan çağrıyla ilgili bir şey olduğunu varsaymak üzereyim. Belki de sunucumdan sunucuya giden çağrıyı engelleyen bir güvenlik duvarı sorunu, aynı zamanda geliştirme makinemden aynı sunucuya gitmesine izin veriyor.