2013-08-06 4 views
1

У меня возникли проблемы с вызовом метода в службе WCF из классического ASP. Ниже приведен код для обслуживания и конфигурации:Вызвать службу WCF от классического ASP

Service

[ServiceContract(Namespace = "http://Plumtree.dartKW.PdfGenerator.Web")] 
public interface IPdfGeneratorService 
{ 
    [OperationContract] 
    String GeneratePdf(String xml); 
} 

public class PdfGeneratorService : IPdfGeneratorService 
{ 
    #region IPdfGeneratorService Members 

    public String GeneratePdf(String xml) 
    { 
     return "hello"; 
    } 

    #endregion 
} 

Конфигурация

<system.serviceModel> 
    <bindings> 
    <basicHttpBinding> 
     <binding name="BasicHttpBinding_PdfGenerator" 
       maxBufferSize="2147483647" 
       maxReceivedMessageSize="2147483647" 
       maxBufferPoolSize="2147483647" 
       transferMode="Buffered"> 
     <readerQuotas 
      maxArrayLength="2147483647" 
      maxStringContentLength="2147483647" 
      maxBytesPerRead="2147483647" 
      maxNameTableCharCount="2147483647" 
      maxDepth="32" /> 
     </binding> 
    </basicHttpBinding> 
    </bindings> 
    <services> 
    <service behaviorConfiguration="serviceBehavior" 
      name="Plumtree.dartKW.PdfGenerator.Web.PdfGeneratorService"> 
     <endpoint binding="basicHttpBinding" 
       bindingName="BasicHttpBinding_PdfGenerator" 
       contract="Plumtree.dartKW.PdfGenerator.Web.IPdfGeneratorService" /> 
     <endpoint address="mex" 
       binding="mexHttpBinding" 
       contract="IMetadataExchange" /> 
    </service> 
    </services> 
    <behaviors> 
    <serviceBehaviors> 
     <behavior name="serviceBehavior"> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
</system.serviceModel> 

Я тестировал выше метод в клиенте тестирования WCF и он отлично работает , Вот код из моей страницы осины:

mexMonikerString = "service:mexAddress='http://localhost:51997/PdfGeneratorService.svc/mex'" 
mexMonikerString = mexMonikerString + ", address='http://localhost:51997/PdfGeneratorService.svc'" 
mexMonikerString = mexMonikerString + ", binding=basicHttpBinding" 
mexMonikerString = mexMonikerString + ", bindingNamespace='http://tempuri.org/'" 
mexMonikerString = mexMonikerString + ", contract=IPdfGeneratorService" 
mexMonikerString = mexMonikerString + ", contractNamespace='http://Plumtree.dartKW.PdfGenerator.Web'" 

dim service 
service = GetObject(mexMonikerString) 

Всякий раз, когда я пытаюсь это я получаю следующее сообщение об ошибке:

System.ServiceModel error '800401e4'

The contract does not have an endpoint supporting the binding specified.

Я попытался прохождения связывающую имя конфигурации BasicHttpBinding_PdfGenerator в прозвища вместо basicHttpBinding но Я получаю ту же ошибку. Я также не могу найти другие примеры этой ошибки в Интернете.

Любая помощь будет принята с благодарностью

ответ

0

Вы можете сделать это с помощью JavaScript без особых трудностей. Вот копия некоторого JavaScript, встроенного в простую HTML-страницу, которую я предоставляю своим будущим пользователям веб-сервиса WCF.

Жесткая часть может быть выяснена, что ожидает служба WCF в запросе. Если у вас есть доступ к коду службы WCF, это довольно легко понять. Другой способ - использовать Fiddler для захвата успешных сообщений, отправленных между клиентом и хостом wcf. Или WSDL, если вы можете его создать.

Удачи.

function Ping() {    
//set up varable 
var sContent; 
// 'Content-Type: text/xml \r\n ' + 
// 'Host: localhost:8085 \r\n \r\n '; 
sContent= "<xml>Your message matching the web service's data or message contract</xml>"; 

var xmlhttp = new XMLHttpRequest(); 
xmlhttp.open('POST', Demo.URL.value, true); 
xmlhttp.onreadystatechange = function() { 
//this section acts as a listener, waiting for response from host 
if (xmlhttp.readyState == 4||xmlhttp.readyState == 0) { 
    //alert("Ready state: " + xmlhttp.readyState.toString()); 
    if (xmlhttp.status == 200) { 
     //alert("good"); 
     Demo.pingresponse.value = "Response: " +xmlhttp.responseText; 
    } 
    if (xmlhttp.status !=200){ 
     //alert("bad"); 
     Demo.pingresponse.value = "Error: " +xmlhttp.status.toString() +" response text: " +xmlhttp.responseText; 
    } 
} else { 
    //alert("readystate bad"); 
} 
} 
//send request  

xmlhttp.setRequestHeader("POST http:localhost:8085/HostInterface/HostConnect HTTP/1.1"); 
xmlhttp.setRequestHeader("VsDebuggerCausalityData",""); 
xmlhttp.setRequestHeader ("SOAPAction","\"http://somestuff\""); 
xmlhttp.setRequestHeader("Host","localhost:8085"); 
xmlhttp.setRequestHeader("Expect","100-continue"); 
xmlhttp.setRequestHeader("Accept-Encoding","gzip, deflate"); 
xmlhttp.setRequestHeader("Connection","Keep-Alive"); 
xmlhttp.setRequestHeader("Content-Length","639");     
xmlhttp.setRequestHeader("Content-type", "text/xml; charset=utf-8"); 
xmlhttp.send(sContent);     
} 
+0

Спасибо за ваш ответ. Согласно бесчисленным онлайн-демонстрациям, которые я прочитал, мой оригинальный код ДОЛЖЕН работать. Существует проблема где-то с конфигурацией службы или с прописью, которую я создаю. Есть множество примеров того, как люди делают то, что я пытаюсь сделать, к сожалению, похоже, что кто-то сталкивался с той же ошибкой, что и я! Очень расстраивает –

+0

Понял .. Я думаю, если вы не можете заставить свою версию ASP работать, вы можете попробовать, что я делаю. Он легко помещается в любую конструкцию типа HTML/ASP. – Brian

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